A compressor that allow packaging any resource from anywhere into a Zip/Jar/Apk
- Support Zip/Jar/Apk Formats
- Compress Any File into a Zip File
- Compress Any Directory into a Zip File
- Decompress and Modify Zip File
- Rename Existed Files
- Resources Could Come from Project, Build, Disk, Artifact, or Task Output
- Output Zip File Can Be Used as Input of Other Gradle Tasks
- Output of Other Gradle Tasks Can Be Used as Input of Compress Task
- Customized Output Path and Format
- Flexible Apis Provided by DSL Object
- Support Task Instant Execution without Gradle Command
- JDK Version above 11
- Gradle Version above 8.6
Step into Next. Now good fun starts
settings.gradle.kts
pluginManagement {
plugins {
id("org.jetbrains.kotlin.jvm") version "1.9.23"
id("io.github.byteflys.compressor") version "3.0.4"
}
}
dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS
repositories {
mavenCentral()
gradlePluginPortal()
}
}
buildscript {
repositories {
mavenCentral()
gradlePluginPortal()
}
dependencies {
classpath("io.github.byteflys:compressor:3.0.4")
}
}
build.gradle.kts
plugins {
id("org.jetbrains.kotlin.jvm")
id("io.github.byteflys.compressor")
}
build.gradle.kts
compressor {
zipPath = path(BUILD, DIRECTORY, "./")
zipName = "compressed"
zipFormat = "jar"
}
Plugin provides a dsl object named compressor
with type CompressTask
CompressTask provides a serial of apis that start with copyXXX
This topic will be detailed later
build.gradle.kts
compressor {
val diskDir = path(ABSOLUTE, DIRECTORY, "/Users/easing/Dev/Gradle/gradle-8.7")
copyDirectory(diskDir, "./")
}
terminal
gradle compress
Until this point, you have completed the plugin integration
For more detailed usage, please read on
Supported formats : Zip/Jar/Apk
build.gradle.kts
compressor {
zipPath = path(BUILD, DIRECTORY, "./")
zipName = "compressed"
zipFormat = "jar"
}
Specify a file as task output, if other reliant task need to visit it
build.gradle.kts
compressor {
val outputFile = outputZipFile()
outputs.file(outputFile)
}
If you don't want to execute task by command line manually
Just call the executeTask api, then task will automatically execute when script is loaded
Executed task must be a child type of ExecutableGradleTask
By default, compress task has implemented ExecutableGradleTask interface
build.gradle.kts
val makeJarTask = tasks.create("makeJar", ExecutableJar::class.java) {
from(path(ROOT_PROJECT, DIRECTORY, "compressor/src"))
archiveBaseName = "makeJar"
destinationDirectory = File(path(ROOT_BUILD, DIRECTORY, "makeJar"))
}
executeTask("makeJar")
executeTask("compress")
Package files from project dir
build.gradle.kts
compressor {
val gradleDir = path(ROOT_PROJECT, DIRECTORY, "gradle")
copyDirectory(gradleDir, "./")
}
Package files from project build dir
build.gradle.kts
compressor {
val buildDir = path(BUILD, FILE, "libs/compressor-3.0.4-main.jar")
copyDirectory(buildDir, "./")
}
Package files from disk dir
build.gradle.kts
compressor {
val diskDir = path(ABSOLUTE, DIRECTORY, "/home/easing/Dev/Gradle/gradle-8.7")
copyDirectory(diskDir, "./")
}
Package generated files of other task
build.gradle.kts
val makeJarTask = tasks.create("makeJar", Jar::class.java) {
from(path(ROOT_PROJECT, DIRECTORY, "compressor/src"))
archiveBaseName = "makeJar"
destinationDirectory = File(path(ROOT_BUILD, DIRECTORY, "makeJar"))
}
compressor {
val jarTask = tasks.named("makeJar", Jar::class.java)
val taskOutput = jarTask.get().archiveFile.filePath()
copyFile(taskOutput, "./")
dependsOn("makeJar")
}
Package artifact defined by script or other plugin
build.gradle.kts
configurations {
create("artifacts")
}
val jarArtifact = artifacts.add("artifacts", makeJarTask) {
name = "jarArtifact"
}
val fileArtifact = artifacts.add("artifacts", File("/home/easing/Dev/Gradle/gradle-8.6")) {
name = "fileArtifact"
}
compressor {
copyArtifact(jarArtifact, jarArtifact.name)
copyArtifact(fileArtifact, fileArtifact.name, IS_DIRECTORY or COPY_TO_DIRECTORY or INCLUDE_PARENT_DIRECTORY)
}
build.gradle.kts
compressor {
val originFile = tempZipDir().file("makeJar.jar").filePath()
rename(originFile, "make-jar-output.jar")
}
build.gradle.kts
import io.github.byteflys.compressor.core.ExecutableJar
import io.github.byteflys.compressor.core.executeTask
import io.github.byteflys.compressor.gradle.FileFlags.COPY_TO_DIRECTORY
import io.github.byteflys.compressor.gradle.FileFlags.INCLUDE_PARENT_DIRECTORY
import io.github.byteflys.compressor.gradle.FileFlags.IS_DIRECTORY
import io.github.byteflys.compressor.gradle.FileType.DIRECTORY
import io.github.byteflys.compressor.gradle.FileType.FILE
import io.github.byteflys.compressor.gradle.PathType.ABSOLUTE
import io.github.byteflys.compressor.gradle.PathType.BUILD
import io.github.byteflys.compressor.gradle.PathType.ROOT_BUILD
import io.github.byteflys.compressor.gradle.PathType.ROOT_PROJECT
import io.github.byteflys.compressor.gradle.filePath
import io.github.byteflys.compressor.gradle.path
plugins {
id("io.github.byteflys.compressor")
}
// create jar
val makeJarTask = tasks.create("makeJar", ExecutableJar::class.java) {
from(path(ROOT_PROJECT, DIRECTORY, "compressor/src"))
archiveBaseName = "makeJar"
destinationDirectory = File(path(ROOT_BUILD, DIRECTORY, "makeJar"))
}
// create configurations
configurations {
create("artifacts")
}
// create artifacts
val jarArtifact = artifacts.add("artifacts", makeJarTask) {
name = "jarArtifact"
}
val fileArtifact = artifacts.add("artifacts", File("/home/easing/Dev/Gradle/gradle-8.6")) {
name = "fileArtifact"
}
compressor {
// specify export path
zipPath = path(BUILD, DIRECTORY, "./")
zipName = "compressed"
zipFormat = "jar"
// include project files
val gradleDir = path(ROOT_PROJECT, DIRECTORY, "gradle")
copyDirectory(gradleDir, "./")
// include build files
val buildDir = path(BUILD, FILE, "libs/compressor-3.0.4-main.jar")
copyDirectory(buildDir, "./")
// include disk files
val diskDir = path(ABSOLUTE, DIRECTORY, "/home/easing/Dev/Gradle/gradle-8.7")
copyDirectory(diskDir, "./")
// include task output
val jarTask = tasks.named("makeJar", Jar::class.java)
val taskOutput = jarTask.get().archiveFile.filePath()
copyFile(taskOutput, "./")
dependsOn("makeJar")
// include artifact
copyArtifact(jarArtifact, jarArtifact.name)
copyArtifact(fileArtifact, fileArtifact.name, IS_DIRECTORY or COPY_TO_DIRECTORY or INCLUDE_PARENT_DIRECTORY)
// rename resource
val originFile = tempZipDir().file("makeJar.jar").filePath()
rename(originFile, "make-jar-output.jar")
// set task output
val outputFile = outputZipFile()
outputs.file(outputFile)
}
// instant execute
executeTask("makeJar")
executeTask("compress")
We get a zip file like this