plugins {
id 'io.spring.nohttp' version '0.0.11'
id 'io.freefair.aspectj' version '6.5.0.3' apply false
// kotlinVersion is managed in gradle.properties
id 'org.jetbrains.kotlin.plugin.serialization' version "${kotlinVersion}" apply false
id 'org.jetbrains.dokka' version '1.7.20'
id 'org.asciidoctor.jvm.convert' version '3.3.2' apply false
id 'org.asciidoctor.jvm.pdf' version '3.3.2' apply false
id 'org.unbroken-dome.xjc' version '2.0.0' apply false
id 'com.github.ben-manes.versions' version '0.42.0'
id 'com.github.johnrengelman.shadow' version '7.1.2' apply false
id 'de.undercouch.download' version '5.1.0'
id 'me.champeau.jmh' version '0.6.8' apply false
}
ext {
moduleProjects = subprojects . findAll { it . name . startsWith ( "spring-" ) }
javaProjects = subprojects - project ( ":framework-bom" ) - project ( ":framework-platform" )
}
configure ( allprojects ) { project - >
repositories {
mavenCentral ( )
maven {
url "https://repo.spring.io/milestone"
content {
// Netty 5 optional support
includeGroup 'io.projectreactor.netty'
}
}
maven { url "https://repo.spring.io/libs-spring-framework-build" }
if ( version . contains ( '-' ) ) {
maven { url "https://repo.spring.io/milestone" }
}
if ( version . endsWith ( '-SNAPSHOT' ) ) {
maven { url "https://repo.spring.io/snapshot" }
}
}
configurations . all {
resolutionStrategy {
cacheChangingModulesFor 0 , "seconds"
cacheDynamicVersionsFor 0 , "seconds"
}
}
}
configure ( [ rootProject ] + javaProjects ) { project - >
group = "org.springframework"
apply plugin: "java"
apply plugin: "java-test-fixtures"
apply plugin: "checkstyle"
apply plugin: 'org.springframework.build.conventions'
apply from: "${rootDir}/gradle/toolchains.gradle"
apply from: "${rootDir}/gradle/ide.gradle"
configurations {
dependencyManagement {
canBeConsumed = false
canBeResolved = false
visible = false
}
matching { it . name . endsWith ( "Classpath" ) } . all { it . extendsFrom ( dependencyManagement ) }
}
test {
useJUnitPlatform ( )
include ( [ "**/*Tests.class" , "**/*Test.class" ] )
systemProperty ( "java.awt.headless" , "true" )
systemProperty ( "testGroups" , project . properties . get ( "testGroups" ) )
systemProperty ( "io.netty.leakDetection.level" , "paranoid" )
systemProperty ( "io.netty5.leakDetectionLevel" , "paranoid" )
systemProperty ( "io.netty5.leakDetection.targetRecords" , "32" )
systemProperty ( "io.netty5.buffer.lifecycleTracingEnabled" , "true" )
systemProperty ( "io.netty5.buffer.leakDetectionEnabled" , "true" )
jvmArgs ( [ "--add-opens=java.base/java.lang=ALL-UNNAMED" ,
"--add-opens=java.base/java.util=ALL-UNNAMED" ] )
}
checkstyle {
toolVersion = "10.7.0"
configDirectory . set ( rootProject . file ( "src/checkstyle" ) )
}
tasks . named ( "checkstyleMain" ) . configure {
maxHeapSize = "1g"
}
tasks . named ( "checkstyleTest" ) . configure {
maxHeapSize = "1g"
}
dependencies {
dependencyManagement ( enforcedPlatform ( dependencies . project ( path: ":framework-platform" ) ) )
testImplementation ( "org.junit.jupiter:junit-jupiter-api" )
testImplementation ( "org.junit.jupiter:junit-jupiter-params" )
testImplementation ( "org.junit.platform:junit-platform-suite-api" )
testImplementation ( "org.mockito:mockito-core" )
testImplementation ( "org.mockito:mockito-junit-jupiter" )
testImplementation ( "io.mockk:mockk" )
testImplementation ( "org.assertj:assertj-core" )
// Pull in the latest JUnit 5 Launcher API to ensure proper support in IDEs.
testRuntimeOnly ( "org.junit.jupiter:junit-jupiter-engine" )
testRuntimeOnly ( "org.junit.platform:junit-platform-launcher" )
testRuntimeOnly ( "org.junit.platform:junit-platform-suite-engine" )
testRuntimeOnly ( "org.apache.logging.log4j:log4j-core" )
testRuntimeOnly ( "org.apache.logging.log4j:log4j-jul" )
testRuntimeOnly ( "org.apache.logging.log4j:log4j-slf4j-impl" )
// JSR-305 only used for non-required meta-annotations
compileOnly ( "com.google.code.findbugs:jsr305" )
testCompileOnly ( "com.google.code.findbugs:jsr305" )
checkstyle ( "io.spring.javaformat:spring-javaformat-checkstyle:0.0.31" )
}
Eliminate all Javadoc warnings
- Support external Javadoc links using Gradle's javadoc.options.links
- Fix all other Javadoc warnings, such as typos, references to
non-existent (or no longer existent) types and members, etc,
including changes related to the Quartz 2.0 upgrade (SPR-8275) and
adding the HTTP PATCH method (SPR-7985).
- Suppress all output for project-level `javadoc` tasks in order to
hide false-negative warnings about cross-module @see and @link
references (e.g. spring-core having a @see reference to spring-web).
Use the `--info` (-i) flag to gradle at any time to see project-level
javadoc warnings without running the entire `api` task. e.g.
`gradle :spring-core:javadoc -i`
- Favor root project level `api` task for detection of legitimate
Javadoc warnings. There are now zero Javadoc warnings across the
entirety of spring-framework. Goal: keep it that way.
- Remove all @link and @see references to types and members that exist
only in Servlet <= 2.5 and Hibernate <= 4.0, favoring 3.0+ and 4.0+
respectively. This is necessary because only one version of each of
these dependencies can be present on the global `api` javadoc task's
classpath. To that end, the `api` task classpath has now been
customized to ensure that the Servlet 3 API and Hibernate Core 4 jars
have precedence.
- SPR-8896 replaced our dependency on aspectjrt with a dependency on
aspectjweaver, which is fine from a POM point of view, but causes
a spurious warning to be emitted from the ant iajc task that it
"cannot find aspectjrt on the classpath" - even though aspectjweaver
is perfectly sufficient. In the name of keeping the console quiet, a
new `rt` configuration has been added, and aspectjrt added as a
dependency to it. In turn, configurations.rt.asPath is appended to
the iajc classpath during both compileJava and compileTestJava for
spring-aspects.
Issue: SPR-10078, SPR-8275, SPR-7985, SPR-8896
12 years ago
ext . javadocLinks = [
"https://docs.oracle.com/en/java/javase/17/docs/api/" ,
"https://jakarta.ee/specifications/platform/9/apidocs/" ,
"https://docs.oracle.com/cd/E13222_01/wls/docs90/javadocs/" , // CommonJ
"https://www.ibm.com/docs/api/v1/content/SSEQTP_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/" ,
"https://docs.jboss.org/jbossas/javadoc/4.0.5/connector/" ,
"https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/" ,
"https://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/" ,
"https://www.quartz-scheduler.org/api/2.3.0/" ,
"https://www.javadoc.io/doc/com.fasterxml.jackson.core/jackson-core/2.14.1/" ,
"https://www.javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind/2.14.1/" ,
"https://www.javadoc.io/doc/com.fasterxml.jackson.dataformat/jackson-dataformat-xml/2.14.1/" ,
"https://hc.apache.org/httpcomponents-client-5.2.x/current/httpclient5/apidocs/" ,
"https://projectreactor.io/docs/test/release/api/" ,
"https://junit.org/junit4/javadoc/4.13.2/" ,
// TODO Uncomment link to JUnit 5 docs once we have sorted out
// the following warning in the build.
//
// warning: The code being documented uses packages in the unnamed module, but the packages defined in https://junit.org/junit5/docs/5.9.2/api/ are in named modules.
//
// "https://junit.org/junit5/docs/5.9.2/api/",
"https://www.reactive-streams.org/reactive-streams-1.0.3-javadoc/" ,
"https://javadoc.io/static/io.rsocket/rsocket-core/1.1.1/" ,
"https://r2dbc.io/spec/1.0.0.RELEASE/api/" ,
Fix Javadoc links to JSR 305 annotations where feasible
Prior to this commit, we only (indirectly) configured external Javadoc
links for types in the javax.annotation package for JSR 250, since
those types are part of Java 8 SE. However, an external Javadoc link
for types from JSR 305 was not configured.
To address this issue, this commit now configures an external Javadoc
link for JSR 305 types. However, the external Javadoc link for JSR 305
must be configured last to ensure that types from JSR 250 (such as
@PostConstruct) are still supported. This is due to the fact that JSR
250 and JSR 305 both define types in javax.annotation, which results in
a split package, and the javadoc tool does not support split packages
across multiple external Javadoc sites. Instead, the Javadoc tool
iterates over all external links, and the first external site that
claims to support a given package (via the package-list file) wins.
This means:
- Javadoc for JSR 250 annotations is fully supported.
- Javadoc for JSR 305 annotations in the javax.annotation package will
continue to result in a 404 (page not found) error.
- Javadoc for JSR 305 annotations in the javax.annotation.meta package
is fully supported.
For Spring Framework 6.0, the Javadoc for JSR 250 types in
jakarta.annotation package is served from the JBoss Application Server
Javadoc site instead of from Oracle's Java SE documentation site, since
JSR 250 annotations are no longer included in Java SE.
Closes gh-27904
3 years ago
// The external Javadoc link for JSR 305 must come last to ensure that types from
// JSR 250 (such as @PostConstruct) are still supported. This is due to the fact
// that JSR 250 and JSR 305 both define types in javax.annotation, which results
// in a split package, and the javadoc tool does not support split packages
// across multiple external Javadoc sites.
"https://www.javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/"
Eliminate all Javadoc warnings
- Support external Javadoc links using Gradle's javadoc.options.links
- Fix all other Javadoc warnings, such as typos, references to
non-existent (or no longer existent) types and members, etc,
including changes related to the Quartz 2.0 upgrade (SPR-8275) and
adding the HTTP PATCH method (SPR-7985).
- Suppress all output for project-level `javadoc` tasks in order to
hide false-negative warnings about cross-module @see and @link
references (e.g. spring-core having a @see reference to spring-web).
Use the `--info` (-i) flag to gradle at any time to see project-level
javadoc warnings without running the entire `api` task. e.g.
`gradle :spring-core:javadoc -i`
- Favor root project level `api` task for detection of legitimate
Javadoc warnings. There are now zero Javadoc warnings across the
entirety of spring-framework. Goal: keep it that way.
- Remove all @link and @see references to types and members that exist
only in Servlet <= 2.5 and Hibernate <= 4.0, favoring 3.0+ and 4.0+
respectively. This is necessary because only one version of each of
these dependencies can be present on the global `api` javadoc task's
classpath. To that end, the `api` task classpath has now been
customized to ensure that the Servlet 3 API and Hibernate Core 4 jars
have precedence.
- SPR-8896 replaced our dependency on aspectjrt with a dependency on
aspectjweaver, which is fine from a POM point of view, but causes
a spurious warning to be emitted from the ant iajc task that it
"cannot find aspectjrt on the classpath" - even though aspectjweaver
is perfectly sufficient. In the name of keeping the console quiet, a
new `rt` configuration has been added, and aspectjrt added as a
dependency to it. In turn, configurations.rt.asPath is appended to
the iajc classpath during both compileJava and compileTestJava for
spring-aspects.
Issue: SPR-10078, SPR-8275, SPR-7985, SPR-8896
12 years ago
] as String [ ]
Upgrade to JUnit 4.11 snapshot in support of JDK7
Class#getDeclaredMembers returns arbitrary results under JDK7. This
results in non-deterministic execution of JUnit test methods, often
revealing unintended dependencies between methods that rely on a
specific order to succeed.
JUnit 4.11 contains support for predictable test ordering [1], but at
the time of this commit, JUnit 4.11 has not yet been released.
Therefore we are testing against a snapshot version [2], which has been
uploaded to repo.springsource.org [3] for easy access. Note that this
artifact may be removed when JUnit 4.11 goes GA.
- Care has been taken to ensure that spring-test's compile-time
dependency on JUnit remains at 4.10. This means that the spring-test
pom.xml will continue to have an optional <dependency> on JUnit
4.10, instead of the 4.11 snapshot.
- For reasons not fully understood, the upgrade to the 4.11 snapshot
of junit-dep caused NoSuchMethodErrors around certain Hamcrest
types, particularly CoreMatchers and Matchers. import statements
have been updated accordingly throughout affected test cases.
- Runtime errors also occurred around uses of JUnit @Rule and
ExpectedException. These have been reverted to use simpler
mechanisms like @Test(expected) in the meantime.
- Some test methods with order-based dependencies on one another have
been renamed in order to fall in line with JUnit 4.11's new method
ordering (as opposed to actually fixing the inter-test
dependencies). In other areas, the fix was as simple as adding a
tearDown method and cleaning up state.
- For no apparent reason, the timeout in AspectJAutoProxyCreatorTests'
testAspectsAndAdvisorNotAppliedToPrototypeIsFastEnough method begins
to be exceeded. Prior to this commit the timeout value was 3000 ms;
on the CI server under Linux/JDK6 and JDK7, the test begins taking
anywhere from 3500-5500 ms with this commit. It is presumed that
this is an incidental artifact of the upgrade to JUnit 4.11. In any
case, there are no changes to src/main in this commit, so this
should not actually represent a performance risk for Spring
Framework users. The timeout has been increased to 6000 ms to
accommodate this situation.
[1]: https://github.com/KentBeck/junit/pull/293
[2]: https://github.com/downloads/KentBeck/junit/junit-dep-4.11-SNAPSHOT-20120805-1225.jar
[3]: https://repo.springsource.org/simple/ext-release-local/junit/junit-dep/4.11.20120805.1225
Issue: SPR-9783
12 years ago
}
configure ( moduleProjects ) { project - >
apply from: "${rootDir}/gradle/spring-module.gradle"
}
configure ( rootProject ) {
description = "Spring Framework"
apply plugin: "io.spring.nohttp"
apply plugin: 'org.springframework.build.api-diff'
nohttp {
source . exclude "**/test-output/**"
allowlistFile = project . file ( "src/nohttp/allowlist.lines" )
def rootPath = file ( rootDir ) . toPath ( )
def projectDirs = allprojects . collect { it . projectDir } + "${rootDir}/buildSrc"
projectDirs . forEach { dir - >
[ 'bin' , 'build' , 'out' , '.settings' ]
. collect { rootPath . relativize ( new File ( dir , it ) . toPath ( ) ) }
. forEach { source . exclude "$it/**" }
[ '.classpath' , '.project' ]
. collect { rootPath . relativize ( new File ( dir , it ) . toPath ( ) ) }
. forEach { source . exclude "$it" }
}
}
tasks . named ( "checkstyleNohttp" ) . configure {
maxHeapSize = "1g"
}
}