import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.github.jengelman.gradle.plugins.shadow.transformers.ComponentsXmlResourceTransformer import org.gradle.internal.jvm.Jvm import org.gradle.kotlin.dsl.support.serviceOf description = "Shaded Maven dependencies resolver" val jarBaseName = the().archivesName val embedded by configurations embedded.apply { exclude("org.slf4j", "slf4j-api") } plugins { kotlin("jvm") id("jps-compatible") } val proguardLibraryJars by configurations.creating { attributes { attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) } } dependencies { api(project(":kotlin-scripting-dependencies")) proguardLibraryJars(project(":kotlin-scripting-dependencies")) embedded(project(":kotlin-scripting-dependencies-maven")) { isTransitive = false } embedded("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.2") embedded("org.apache.maven.resolver:maven-resolver-transport-file:1.9.2") embedded("org.apache.maven.resolver:maven-resolver-transport-wagon:1.9.2") embedded("org.apache.maven.resolver:maven-resolver-impl:1.9.2") embedded("org.apache.maven:maven-core:3.8.7") embedded("org.apache.maven.wagon:wagon-http:3.5.3") embedded("commons-io:commons-io:2.11.0") testImplementation(libs.junit4) testRuntimeOnly("org.slf4j:slf4j-nop:1.7.36") testImplementation(project(":kotlin-scripting-dependencies-maven-all")) } sourceSets { "main" {} "test" { projectDefault() } } publish() noDefaultJar() sourcesJar() javadocJar() val mavenPackagesToRelocate = listOf( "org.eclipse", "org.codehaus", "org.jsoup", "afu", "org.aopalliance", "org.checkerframework", "org.sonatype" ) val relocatedJar by task { configurations = listOf(embedded) duplicatesStrategy = DuplicatesStrategy.INCLUDE destinationDirectory.set(layout.buildDirectory.dir("libs")) archiveClassifier.set("relocated") transform(ComponentsXmlResourceTransformer()) if (kotlinBuildProperties.relocation) { (packagesToRelocate + mavenPackagesToRelocate).forEach { relocate(it, "$kotlinEmbeddableRootPackage.$it") } } } val normalizeComponentsXmlEndings by tasks.registering { dependsOn(relocatedJar) val outputFile = layout.buildDirectory.file("$name/${ComponentsXmlResourceTransformer.COMPONENTS_XML_PATH}") val relocatedJarFile = relocatedJar.map { it.singleOutputFile(layout) } val archiveOperations = serviceOf() outputs.file(outputFile) doFirst { val componentsXml = archiveOperations.zipTree(relocatedJarFile.get()).matching { include { it.path == ComponentsXmlResourceTransformer.COMPONENTS_XML_PATH } }.single().readText() val processedComponentsXml = componentsXml.replace("\r\n", "\n") val outputAsFile = outputFile.get().asFile outputAsFile.parentFile.mkdirs() outputAsFile.writeText(processedComponentsXml) } } val normalizedJar by task { dependsOn(relocatedJar) dependsOn(normalizeComponentsXmlEndings) archiveClassifier.set("normalized") from { zipTree(relocatedJar.get().singleOutputFile(layout)).matching { exclude(ComponentsXmlResourceTransformer.COMPONENTS_XML_PATH) } } into(ComponentsXmlResourceTransformer.COMPONENTS_XML_PATH.substringBeforeLast("/")) { from { normalizeComponentsXmlEndings.map { it.singleOutputFile(layout) } } } } val proguard by task { dependsOn(normalizedJar) configuration("dependencies-maven.pro") injars(mapOf("filter" to "!META-INF/versions/**,!kotlinx/coroutines/debug/**"), normalizedJar.get().outputs.files) outjars(layout.buildDirectory.file(jarBaseName.map { "libs/$it-$version-after-proguard.jar" })) javaLauncher.set(project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_8)) libraryjars(mapOf("filter" to "!META-INF/versions/**"), proguardLibraryJars) libraryjars( files( javaLauncher.map { firstFromJavaHomeThatExists( "jre/lib/rt.jar", "../Classes/classes.jar", jdkHome = it.metadata.installationPath.asFile )!! }, javaLauncher.map { firstFromJavaHomeThatExists( "jre/lib/jsse.jar", "../Classes/jsse.jar", jdkHome = it.metadata.installationPath.asFile )!! }, javaLauncher.map { Jvm.forHome(it.metadata.installationPath.asFile).toolsJar!! } ) ) } val resultJar by task { val pack = if (kotlinBuildProperties.proguard) proguard else normalizedJar dependsOn(pack) setupPublicJar(jarBaseName) from { zipTree(pack.map { it.singleOutputFile(layout) }) } } setPublishableArtifact(resultJar)