This commit updates the whole Spring Framework codebase to use JSpecify annotations instead of Spring null-safety annotations with JSR 305 semantics. JSpecify provides signficant enhancements such as properly defined specifications, a canonical dependency with no split-package issue, better tooling, better Kotlin integration and the capability to specify generic type, array and varargs element null-safety. Generic type null-safety is not defined by this commit yet and will be specified later. A key difference is that Spring null-safety annotations, following JSR 305 semantics, apply to fields, parameters and return values, while JSpecify annotations apply to type usages. That's why this commit moves nullability annotations closer to the type for fields and return values. See gh-28797
165 lines
5.3 KiB
Groovy
165 lines
5.3 KiB
Groovy
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
|
import org.springframework.build.shadow.ShadowSource
|
|
|
|
plugins {
|
|
id 'me.champeau.mrjar'
|
|
}
|
|
|
|
description = "Spring Core"
|
|
|
|
apply plugin: "kotlin"
|
|
apply plugin: "kotlinx-serialization"
|
|
|
|
multiRelease {
|
|
targetVersions 17, 21
|
|
}
|
|
|
|
def javapoetVersion = "1.13.0"
|
|
def objenesisVersion = "3.4"
|
|
|
|
configurations {
|
|
java21Api.extendsFrom(api)
|
|
java21Implementation.extendsFrom(implementation)
|
|
javapoet
|
|
objenesis
|
|
graalvm
|
|
}
|
|
|
|
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 {
|
|
javapoet("com.squareup:javapoet:${javapoetVersion}@jar")
|
|
objenesis("org.objenesis:objenesis:${objenesisVersion}@jar")
|
|
api(files(javapoetRepackJar))
|
|
api(files(objenesisRepackJar))
|
|
api("commons-logging:commons-logging")
|
|
api("org.jspecify:jspecify")
|
|
compileOnly("io.projectreactor.tools:blockhound")
|
|
compileOnly("org.graalvm.sdk:graal-sdk")
|
|
optional("io.micrometer:context-propagation")
|
|
optional("io.netty:netty-buffer")
|
|
optional("io.netty:netty5-buffer")
|
|
optional("io.projectreactor:reactor-core")
|
|
optional("io.reactivex.rxjava3:rxjava")
|
|
optional("io.smallrye.reactive:mutiny")
|
|
optional("net.sf.jopt-simple:jopt-simple")
|
|
optional("org.aspectj:aspectjweaver")
|
|
optional("org.eclipse.jetty:jetty-io")
|
|
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")
|
|
testFixturesImplementation("com.google.code.findbugs:jsr305")
|
|
testFixturesImplementation("io.projectreactor:reactor-test")
|
|
testFixturesImplementation("org.assertj:assertj-core")
|
|
testFixturesImplementation("org.junit.platform:junit-platform-launcher")
|
|
testFixturesImplementation("org.junit.jupiter:junit-jupiter-api")
|
|
testFixturesImplementation("org.junit.jupiter:junit-jupiter-params")
|
|
testFixturesImplementation("org.xmlunit:xmlunit-assertj")
|
|
testImplementation("com.fasterxml.jackson.core:jackson-databind")
|
|
testImplementation("com.fasterxml.woodstox:woodstox-core")
|
|
testImplementation("com.google.code.findbugs:jsr305")
|
|
testImplementation("com.squareup.okhttp3:mockwebserver")
|
|
testImplementation("io.projectreactor:reactor-test")
|
|
testImplementation("io.projectreactor.tools:blockhound")
|
|
testImplementation("jakarta.annotation:jakarta.annotation-api")
|
|
testImplementation("jakarta.xml.bind:jakarta.xml.bind-api")
|
|
testImplementation("org.jetbrains.kotlinx:kotlinx-serialization-json")
|
|
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
|
|
testImplementation("org.mockito:mockito-core")
|
|
testImplementation("com.networknt:json-schema-validator");
|
|
testImplementation("org.skyscreamer:jsonassert")
|
|
testImplementation("org.xmlunit:xmlunit-assertj")
|
|
testImplementation("org.xmlunit:xmlunit-matchers")
|
|
}
|
|
|
|
jar {
|
|
manifest.attributes["Dependencies"] = "jdk.unsupported,org.jboss.vfs" // for WildFly (Objenesis and VfsUtils)
|
|
|
|
dependsOn javapoetRepackJar
|
|
from(zipTree(javapoetRepackJar.archiveFile)) {
|
|
include "org/springframework/javapoet/**"
|
|
}
|
|
|
|
dependsOn objenesisRepackJar
|
|
from(zipTree(objenesisRepackJar.archiveFile)) {
|
|
include "org/springframework/objenesis/**"
|
|
}
|
|
}
|
|
|
|
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 javapoetSourceJar
|
|
dependsOn objenesisSourceJar
|
|
from javapoetSource
|
|
from objenesisSource
|
|
}
|
|
|
|
eclipse {
|
|
synchronizationTasks 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))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
tasks['eclipse'].dependsOn(javapoetRepackJar, javapoetSourceJar, objenesisRepackJar, objenesisSourceJar)
|