Optimize embeddable JARs

Exclude the compiler dummy JAR from the resulting shadow JAR
This commit is contained in:
Sergey Igushkin
2017-12-15 18:26:00 +03:00
parent 3a807cb39b
commit c55f08a166
+15 -18
View File
@@ -1,10 +1,8 @@
@file:Suppress("unused") // usages in build scripts are not tracked properly @file:Suppress("unused") // usages in build scripts are not tracked properly
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.GradleException
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.file.DuplicatesStrategy import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.tasks.bundling.Zip
import org.gradle.jvm.tasks.Jar import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.task import org.gradle.kotlin.dsl.task
import org.gradle.kotlin.dsl.* import org.gradle.kotlin.dsl.*
@@ -104,23 +102,22 @@ fun Project.embeddableCompilerDummyForDependenciesRewriting(taskName: String = "
} }
} }
fun Project.rewriteDepsToShadedJar(originalJarTask: Jar, shadowJarTask: Zip, body: Jar.() -> Unit = {}): Jar { fun Project.rewriteDepsToShadedJar(originalJarTask: Jar, shadowJarTask: Jar, body: Jar.() -> Unit = {}): Jar {
val originalFiles by lazy { originalJarTask.apply {
val jarContents = zipTree(originalJarTask.outputs.files.singleFile).files classifier = "original"
val basePath = jarContents.find { it.name == "MANIFEST.MF" }?.parentFile?.parentFile ?: throw GradleException("cannot determine the jar root dir")
jarContents.map { it.relativeTo(basePath).path }.toSet()
} }
return task<Jar>("rewrittenDepsJar") {
originalJarTask.apply { val compilerDummyJarFile by lazy { configurations.getAt("compilerDummyJar").singleFile }
classifier = "original"
} return shadowJarTask.apply {
shadowJarTask.apply { dependsOn(originalJarTask)
dependsOn(originalJarTask) from(originalJarTask)// { include("**") }
from(originalJarTask)// { include("**") }
classifier = "shadow" // When Gradle traverses the inputs, reject the shaded compiler JAR,
} // which leads to the content of that JAR being excluded as well:
dependsOn(shadowJarTask) exclude { it.file == compilerDummyJarFile }
from(project.zipTree(shadowJarTask.outputs.files.singleFile)) { include { originalFiles.any { originalFile -> it.file.canonicalPath.endsWith(originalFile) } } }
classifier = null
body() body()
} }
} }