import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.springframework.build.shadow.ShadowSource description = "Spring Core" apply plugin: "kotlin" // spring-core includes asm, javapoet and repackages cglib, inlining all into the // spring-core jar. cglib itself depends on asm and is therefore further transformed by // the ShadowJar task to depend on org.springframework.asm; this avoids including two // different copies of asm. def cglibVersion = "3.3.0" def javapoetVersion = "1.13.0" def objenesisVersion = "3.2" configurations { cglib javapoet objenesis graalvm } task cglibRepackJar(type: ShadowJar) { archiveBaseName = 'spring-cglib-repack' archiveVersion = cglibVersion configurations = [project.configurations.cglib] relocate('net.sf.cglib', 'org.springframework.cglib') relocate('org.objectweb.asm', 'org.springframework.asm') } task cglibSource(type: ShadowSource) { configurations = [project.configurations.cglib] relocate('net.sf.cglib', 'org.springframework.cglib') relocate('org.objectweb.asm', 'org.springframework.asm') outputDirectory = file("build/shadow-source/cglib") } task cglibSourceJar(type: Jar) { archiveBaseName = 'spring-cglib-repack' archiveVersion = cglibVersion archiveClassifier = 'sources' from cglibSource } task javapoetRepackJar(type: ShadowJar) { archiveBaseName = 'spring-javapoet-repack' archiveVersion = javapoetVersion configurations = [project.configurations.javapoet] relocate('com.squareup.javapoet', 'org.springframework.javapoet') } task javapoetSource(type: ShadowSource) { configurations = [project.configurations.javapoet] relocate('com.squareup.javapoet', 'org.springframework.javapoet') outputDirectory = file("build/shadow-source/javapoet") } task javapoetSourceJar(type: Jar) { archiveBaseName = 'spring-javapoet-repack' archiveVersion = javapoetVersion archiveClassifier = 'sources' from javapoetSource } task objenesisRepackJar(type: ShadowJar) { archiveBaseName = 'spring-objenesis-repack' archiveVersion = objenesisVersion configurations = [project.configurations.objenesis] relocate('org.objenesis', 'org.springframework.objenesis') } task objenesisSource(type: ShadowSource) { configurations = [project.configurations.objenesis] relocate('org.objenesis', 'org.springframework.objenesis') outputDirectory = file("build/shadow-source/objenesis") } task objenesisSourceJar(type: Jar) { archiveBaseName = 'spring-objenesis-repack' archiveVersion = objenesisVersion archiveClassifier = 'sources' from objenesisSource } dependencies { cglib("cglib:cglib:${cglibVersion}@jar") javapoet("com.squareup:javapoet:${javapoetVersion}@jar") objenesis("org.objenesis:objenesis:${objenesisVersion}@jar") graalvm(project(path: ":graalvm-feature", configuration: 'classesOnlyElements')) api(files(cglibRepackJar)) api(files(javapoetRepackJar)) api(files(objenesisRepackJar)) api(project(":spring-jcl")) compileOnly("io.projectreactor.tools:blockhound") optional("net.sf.jopt-simple:jopt-simple") optional("org.aspectj:aspectjweaver") optional("org.jetbrains.kotlin:kotlin-reflect") optional("org.jetbrains.kotlin:kotlin-stdlib") optional("org.jetbrains.kotlinx:kotlinx-coroutines-core") optional("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") optional("io.projectreactor:reactor-core") optional("io.reactivex.rxjava3:rxjava") optional("io.smallrye.reactive:mutiny") optional("io.netty:netty-buffer") testImplementation("jakarta.annotation:jakarta.annotation-api") testImplementation("jakarta.xml.bind:jakarta.xml.bind-api") testImplementation("com.google.code.findbugs:jsr305") testImplementation("com.fasterxml.woodstox:woodstox-core") testImplementation("org.xmlunit:xmlunit-assertj") testImplementation("org.xmlunit:xmlunit-matchers") testImplementation("io.projectreactor:reactor-test") testImplementation("io.projectreactor.tools:blockhound") testImplementation("org.skyscreamer:jsonassert") testFixturesImplementation("com.google.code.findbugs:jsr305") testFixturesImplementation("org.junit.platform:junit-platform-launcher") testFixturesImplementation("org.junit.jupiter:junit-jupiter-api") testFixturesImplementation("org.junit.jupiter:junit-jupiter-params") testFixturesImplementation("org.assertj:assertj-core") testFixturesImplementation("org.xmlunit:xmlunit-assertj") testFixturesImplementation("io.projectreactor:reactor-test") } jar { reproducibleFileOrder = true preserveFileTimestamps = false // maybe not necessary here, but good for reproducibility manifest.attributes["Dependencies"] = "jdk.unsupported" // for WildFly (-> Objenesis 3.2) // Inline repackaged cglib classes directly into spring-core jar dependsOn cglibRepackJar from(zipTree(cglibRepackJar.archivePath)) { include "org/springframework/cglib/**" exclude "org/springframework/cglib/beans/**" exclude "org/springframework/cglib/core/AbstractClassGenerator*.class" exclude "org/springframework/cglib/core/AsmApi*.class" exclude "org/springframework/cglib/core/KeyFactory.class" exclude "org/springframework/cglib/core/KeyFactory\$*.class" exclude "org/springframework/cglib/core/ReflectUtils*.class" exclude "org/springframework/cglib/proxy/Enhancer*.class" exclude "org/springframework/cglib/proxy/MethodProxy*.class" } dependsOn javapoetRepackJar from(zipTree(javapoetRepackJar.archivePath)) { include "org/springframework/javapoet/**" } dependsOn objenesisRepackJar from(zipTree(objenesisRepackJar.archivePath)) { include "org/springframework/objenesis/**" } from configurations.graalvm } test { // Make sure the classes dir is used on the test classpath (required by ResourceTests). // When test fixtures are involved, the JAR is used by default. classpath = sourceSets.main.output.classesDirs + files(sourceSets.main.output.resourcesDir) + classpath - files(jar.archiveFile) // Ensure that BlockHound tests run on JDK 13+. For details, see: // https://github.com/reactor/BlockHound/issues/33 jvmArgs += [ "-XX:+AllowRedefinitionToAddDeleteMethods" ] } sourcesJar { dependsOn cglibSourceJar dependsOn javapoetSourceJar dependsOn objenesisSourceJar from cglibSource from javapoetSource from objenesisSource } eclipse { synchronizationTasks cglibSourceJar, javapoetSourceJar, objenesisSourceJar classpath { file { whenMerged { def pattern = ~/\/spring-\w+-repack-/ entries.forEach { if (pattern.matcher(it.path).find()) { def sourcesJar = it.path.replace('.jar', '-sources.jar'); it.sourcePath = fileReference(file(sourcesJar)) } } } } } }