buildscript { repositories { maven { url "https://repo.spring.io/plugins-release" } } dependencies { classpath("io.spring.gradle:propdeps-plugin:0.0.9.RELEASE") classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16") } } // 3rd party plugin repositories can be configured in settings.gradle plugins { id "io.spring.dependency-management" version "1.0.7.RELEASE" apply false id "org.jetbrains.kotlin.jvm" version "1.2.71" apply false id "org.jetbrains.dokka" version "0.9.18" id "org.asciidoctor.convert" version "1.5.8" } ext { linkHomepage = "https://spring.io/projects/spring-framework" linkCi = "https://build.spring.io/browse/SPR" linkIssue = "https://github.com/spring-projects/spring-framework/issues" linkScmUrl = "https://github.com/spring-projects/spring-framework" linkScmConnection = "scm:git:git://github.com/spring-projects/spring-framework.git" linkScmDevConnection = "scm:git:ssh://git@github.com:spring-projects/spring-framework.git" moduleProjects = subprojects.findAll { !it.name.equals("spring-build-src") && !it.name.equals("spring-framework-bom") } aspectjVersion = "1.9.4" freemarkerVersion = "2.3.28" groovyVersion = "2.5.8" hsqldbVersion = "2.4.1" jackson2Version = "2.9.9" jettyVersion = "9.4.24.v20191120" junit5Version = "5.3.2" kotlinVersion = "1.2.71" log4jVersion = "2.11.2" nettyVersion = "4.1.43.Final" reactorVersion = "Californium-SR14" rxjavaVersion = "1.3.8" rxjavaAdapterVersion = "1.2.1" rxjava2Version = "2.2.15" slf4jVersion = "1.7.28" // spring-jcl + consistent 3rd party deps tiles3Version = "3.0.8" tomcatVersion = "9.0.29" undertowVersion = "2.0.28.Final" gradleScriptDir = "${rootProject.projectDir}/gradle" withoutJclOverSlf4j = { exclude group: "org.slf4j", module: "jcl-over-slf4j" } } configure(allprojects) { project -> group = "org.springframework" version = qualifyVersionIfNecessary(version) apply plugin: "java" apply plugin: "kotlin" apply plugin: "checkstyle" apply plugin: "propdeps" apply plugin: "test-source-set-dependencies" apply plugin: "io.spring.dependency-management" apply from: "${gradleScriptDir}/ide.gradle" dependencyManagement { resolutionStrategy { cacheChangingModulesFor 0, "seconds" } applyMavenExclusions = false generatedPomCustomization { enabled = false } } configurations.all { // Check for updates every build resolutionStrategy.cacheChangingModulesFor 0, "seconds" // Consistent slf4j version (e.g. clashes between slf4j versions) resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == "org.slf4j") { details.useVersion slf4jVersion } } } def commonCompilerArgs = ["-Xlint:serial", "-Xlint:cast", "-Xlint:classfile", "-Xlint:dep-ann", "-Xlint:divzero", "-Xlint:empty", "-Xlint:finally", "-Xlint:overrides", "-Xlint:path", "-Xlint:processing", "-Xlint:static", "-Xlint:try", "-Xlint:-options"] compileJava.options*.compilerArgs = commonCompilerArgs + ["-Xlint:varargs", "-Xlint:fallthrough", "-Xlint:rawtypes", "-Xlint:deprecation", "-Xlint:unchecked", "-Werror"] compileTestJava.options*.compilerArgs = commonCompilerArgs + ["-Xlint:-varargs", "-Xlint:-fallthrough", "-Xlint:-rawtypes", "-Xlint:-deprecation", "-Xlint:-unchecked"] compileJava { sourceCompatibility = 1.8 // can be switched to 11 for testing targetCompatibility = 1.8 options.encoding = "UTF-8" } compileTestJava { sourceCompatibility = 1.8 // can be switched to 11 for testing targetCompatibility = 1.8 options.encoding = "UTF-8" options.compilerArgs += "-parameters" } compileKotlin { kotlinOptions { jvmTarget = "1.8" freeCompilerArgs = ["-Xjsr305=strict"] apiVersion = "1.1" languageVersion = "1.1" } } compileTestKotlin { kotlinOptions { jvmTarget = "1.8" freeCompilerArgs = ["-Xjsr305=strict"] } } test { systemProperty("java.awt.headless", "true") systemProperty("testGroups", project.properties.get("testGroups")) systemProperty("io.netty.leakDetection.level", "paranoid") scanForTestClasses = false include(["**/*Tests.class", "**/*Test.class"]) // Since we set scanForTestClasses to false, we need to filter out inner // classes with the "$" pattern; otherwise, using -Dtest.single=MyTests to // run MyTests by itself will fail if MyTests contains any inner classes. exclude(["**/Abstract*.class", '**/*$*']) } checkstyle { toolVersion = "8.26" configDir = rootProject.file("src/checkstyle") } repositories { maven { url "https://repo.spring.io/libs-release" } mavenLocal() } dependencies { testCompile("junit:junit:4.12") { exclude group: "org.hamcrest", module: "hamcrest-core" } testCompile("org.mockito:mockito-core:2.28.2") { exclude group: "org.hamcrest", module: "hamcrest-core" } testCompile("com.nhaarman:mockito-kotlin:1.6.0") { exclude module: "kotlin-stdlib" exclude module: "kotlin-reflect" exclude module: "mockito-core" } testCompile("org.hamcrest:hamcrest-all:1.3") testRuntime("org.apache.logging.log4j:log4j-core:${log4jVersion}") testRuntime("org.apache.logging.log4j:log4j-slf4j-impl:${log4jVersion}") testRuntime("org.apache.logging.log4j:log4j-jul:${log4jVersion}") // JSR-305 only used for non-required meta-annotations compileOnly("com.google.code.findbugs:jsr305:3.0.2") testCompileOnly("com.google.code.findbugs:jsr305:3.0.2") checkstyle("io.spring.javaformat:spring-javaformat-checkstyle:0.0.7") } ext.javadocLinks = [ "https://docs.oracle.com/javase/8/docs/api/", "https://docs.oracle.com/javaee/7/api/", "https://docs.oracle.com/cd/E13222_01/wls/docs90/javadocs/", // CommonJ "https://www.ibm.com/support/knowledgecenter/SS7JFU_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/", "https://glassfish.java.net/nonav/docs/v3/api/", "https://docs.jboss.org/jbossas/javadoc/4.0.5/connector/", "https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/", "https://tiles.apache.org/tiles-request/apidocs/", "https://tiles.apache.org/framework/apidocs/", "https://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/", "https://www.ehcache.org/apidocs/2.10.4", "https://www.quartz-scheduler.org/api/2.3.0/", "https://fasterxml.github.io/jackson-core/javadoc/2.9/", "https://fasterxml.github.io/jackson-databind/javadoc/2.9/", "https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.9/", "https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/", "https://junit.org/junit4/javadoc/4.12/", "https://junit.org/junit5/docs/${junit5Version}/api/" ] as String[] } configure(subprojects - project(":spring-build-src")) { subproject -> apply from: "${gradleScriptDir}/publish-maven.gradle" jar { manifest.attributes["Implementation-Title"] = subproject.name manifest.attributes["Implementation-Version"] = subproject.version manifest.attributes["Automatic-Module-Name"] = subproject.name.replace('-', '.') // for Jigsaw manifest.attributes["Created-By"] = "${System.getProperty("java.version")} (${System.getProperty("java.specification.vendor")})" from("${rootProject.projectDir}/src/docs/dist") { include "license.txt" include "notice.txt" into "META-INF" expand(copyright: new Date().format("yyyy"), version: project.version) } } javadoc { description = "Generates project-level javadoc for use in -javadoc jar" options.encoding = "UTF-8" options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED options.author = true options.header = project.name options.use = true options.links(project.ext.javadocLinks) options.addStringOption("Xdoclint:none", "-quiet") // Suppress warnings due to cross-module @see and @link references. // Note that global 'api' task does display all warnings. logging.captureStandardError LogLevel.INFO logging.captureStandardOutput LogLevel.INFO // suppress "## warnings" message } task sourcesJar(type: Jar, dependsOn: classes) { duplicatesStrategy = DuplicatesStrategy.EXCLUDE classifier = "sources" from sourceSets.main.allSource // Don't include or exclude anything explicitly by default. See SPR-12085. } task javadocJar(type: Jar) { classifier = "javadoc" from javadoc } artifacts { archives sourcesJar archives javadocJar } } configure(rootProject) { description = "Spring Framework" apply plugin: "groovy" apply from: "${gradleScriptDir}/jdiff.gradle" apply from: "${gradleScriptDir}/docs.gradle" dependencyManagement { imports { mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" } } // Don't publish the default jar for the root project configurations.archives.artifacts.clear() dependencies { // for integration tests testCompile(project(":spring-aop")) testCompile(project(":spring-beans")) testCompile(project(":spring-context")) testCompile(project(":spring-core")) testCompile(project(":spring-expression")) testCompile(project(":spring-jdbc")) testCompile(project(":spring-orm")) testCompile(project(":spring-test")) testCompile(project(":spring-tx")) testCompile(project(":spring-web")) testCompile("javax.inject:javax.inject:1") testCompile("javax.resource:javax.resource-api:1.7.1") testCompile("javax.servlet:javax.servlet-api:3.1.0") testCompile("org.aspectj:aspectjweaver:${aspectjVersion}") testCompile("org.hsqldb:hsqldb:${hsqldbVersion}") testCompile("org.hibernate:hibernate-core:5.1.17.Final") } artifacts { archives docsZip archives schemaZip archives distZip } wrapper { doLast() { def gradleOpts = "-XX:MaxMetaspaceSize=1024m -Xmx1024m" def gradleBatOpts = "$gradleOpts -XX:MaxHeapSize=256m" File wrapperFile = file("gradlew") wrapperFile.text = wrapperFile.text.replace("DEFAULT_JVM_OPTS=", "GRADLE_OPTS=\"$gradleOpts \$GRADLE_OPTS\"\nDEFAULT_JVM_OPTS=") File wrapperBatFile = file("gradlew.bat") wrapperBatFile.text = wrapperBatFile.text.replace("set DEFAULT_JVM_OPTS=", "set GRADLE_OPTS=$gradleBatOpts %GRADLE_OPTS%\nset DEFAULT_JVM_OPTS=") } } } /* * Support publication of artifacts versioned by topic branch. * CI builds supply `-P BRANCH_NAME=` to gradle at build time. * If starts with 'SPR-', change version * from BUILD-SNAPSHOT => -SNAPSHOT * e.g. 3.2.1.BUILD-SNAPSHOT => 3.2.1.SPR-1234-SNAPSHOT */ def qualifyVersionIfNecessary(version) { if (rootProject.hasProperty("BRANCH_NAME")) { def qualifier = rootProject.getProperty("BRANCH_NAME") if (qualifier.startsWith("SPR-")) { return version.replace("BUILD", qualifier) } } return version }