plugins { id 'io.spring.dependency-management' version '1.0.11.RELEASE' apply false id 'io.spring.nohttp' version '0.0.10' id "io.freefair.aspectj" version '6.4.0' apply false id 'org.jetbrains.dokka' version '1.6.10' apply false id 'org.jetbrains.kotlin.jvm' version '1.6.20' apply false id "org.jetbrains.kotlin.plugin.serialization" version '1.6.20' apply false id 'org.asciidoctor.jvm.convert' version '3.3.2' id 'org.asciidoctor.jvm.pdf' version '3.3.2' id "org.unbroken-dome.xjc" version '2.0.0' apply false id "com.github.ben-manes.versions" version '0.39.0' id "com.github.johnrengelman.shadow" version '7.0.0' apply false id 'de.undercouch.download' version '4.1.2' id "me.champeau.jmh" version "0.6.6" apply false } ext { moduleProjects = subprojects.findAll { it.name.startsWith("spring-") } javaProjects = subprojects - project(":framework-bom") withoutJclOverSlf4j = { exclude group: "org.slf4j", name: "jcl-over-slf4j" } } configure(allprojects) { project -> apply plugin: "io.spring.dependency-management" dependencyManagement { imports { mavenBom "com.fasterxml.jackson:jackson-bom:2.13.1" mavenBom "io.netty:netty-bom:4.1.77.Final" mavenBom "io.projectreactor:reactor-bom:2022.0.0-M2" mavenBom "io.r2dbc:r2dbc-bom:Borca-SR1" mavenBom "io.rsocket:rsocket-bom:1.1.2" mavenBom "org.eclipse.jetty:jetty-bom:11.0.9" mavenBom "org.jetbrains.kotlin:kotlin-bom:1.6.20" mavenBom "org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.0" mavenBom "org.jetbrains.kotlinx:kotlinx-serialization-bom:1.3.2" mavenBom "org.junit:junit-bom:5.8.2" } dependencies { dependencySet(group: 'org.apache.logging.log4j', version: '2.17.2') { entry 'log4j-api' entry 'log4j-core' entry 'log4j-jul' entry 'log4j-slf4j-impl' } dependency "org.slf4j:slf4j-api:1.7.36" dependency("com.google.code.findbugs:findbugs:3.0.1") { exclude group: "dom4j", name: "dom4j" } dependency "com.google.code.findbugs:jsr305:3.0.2" dependencySet(group: 'org.aspectj', version: '1.9.9.1') { entry 'aspectjrt' entry 'aspectjtools' entry 'aspectjweaver' } dependencySet(group: 'org.apache.groovy', version: '4.0.2') { entry 'groovy' entry 'groovy-jsr223' entry 'groovy-templates' // requires findbugs for warning-free compilation entry 'groovy-xml' } dependency "io.reactivex.rxjava3:rxjava:3.1.4" dependency "io.smallrye.reactive:mutiny:1.4.0" dependency "io.projectreactor.tools:blockhound:1.0.6.RELEASE" dependency "com.fasterxml:aalto-xml:1.3.1" dependency("com.fasterxml.woodstox:woodstox-core:6.2.8") { exclude group: "stax", name: "stax-api" } dependency "com.google.code.gson:gson:2.8.9" dependency "com.google.protobuf:protobuf-java-util:3.19.3" dependency "com.googlecode.protobuf-java-format:protobuf-java-format:1.4" dependency "com.thoughtworks.qdox:qdox:2.0.1" dependency("com.thoughtworks.xstream:xstream:1.4.18") { exclude group: "xpp3", name: "xpp3_min" exclude group: "xmlpull", name: "xmlpull" } dependency "org.eclipse:yasson:2.0.4" dependency("org.codehaus.jettison:jettison:1.3.8") { exclude group: "stax", name: "stax-api" } dependency "org.ogce:xpp3:1.1.6" dependency "org.yaml:snakeyaml:1.30" dependency "com.h2database:h2:2.1.210" dependency "com.github.ben-manes.caffeine:caffeine:3.1.0" dependency "com.github.librepdf:openpdf:1.3.27" dependency "com.rometools:rome:1.18.0" dependency "commons-io:commons-io:2.11.0" dependency "io.vavr:vavr:0.10.4" dependency "net.sf.jopt-simple:jopt-simple:5.0.4" dependencySet(group: 'org.apache.activemq', version: '5.16.2') { entry 'activemq-broker' entry('activemq-kahadb-store') { exclude group: "org.springframework", name: "spring-context" } entry 'activemq-stomp' } dependency "org.apache.commons:commons-pool2:2.9.0" dependencySet(group: 'org.apache.derby', version: '10.14.2.0') { entry 'derby' entry 'derbyclient' } dependency "org.apache.poi:poi-ooxml:5.2.2" dependency "org.apache-extras.beanshell:bsh:2.0b6" dependency "org.freemarker:freemarker:2.3.31" dependency "org.hsqldb:hsqldb:2.5.2" dependency "org.quartz-scheduler:quartz:2.3.2" dependency "org.ehcache:jcache:1.0.1" dependency "org.ehcache:ehcache:3.4.0" dependency "org.hibernate:hibernate-core-jakarta:5.6.8.Final" dependency "org.hibernate:hibernate-validator:7.0.4.Final" dependency "org.webjars:webjars-locator-core:0.48" dependency "org.webjars:underscorejs:1.8.3" dependencySet(group: 'org.apache.tomcat', version: '10.0.20') { entry 'tomcat-util' entry('tomcat-websocket') { exclude group: "org.apache.tomcat", name: "tomcat-servlet-api" exclude group: "org.apache.tomcat", name: "tomcat-websocket-api" } } dependencySet(group: 'org.apache.tomcat.embed', version: '10.0.20') { entry 'tomcat-embed-core' entry 'tomcat-embed-websocket' } dependencySet(group: 'io.undertow', version: '2.2.17.Final') { entry 'undertow-core' entry 'undertow-servlet-jakarta' entry 'undertow-websockets-jsr-jakarta' } dependency "org.eclipse.jetty:jetty-reactive-httpclient:3.0.5" dependency 'org.apache.httpcomponents.client5:httpclient5:5.1.3' dependency 'org.apache.httpcomponents.core5:httpcore5-reactive:5.1.3' dependency("org.apache.httpcomponents:httpclient:4.5.13") { exclude group: "commons-logging", name: "commons-logging" } dependencySet(group: 'com.squareup.okhttp3', version: '3.14.9') { entry 'okhttp' entry 'mockwebserver' } dependency "org.jruby:jruby:9.3.4.0" dependency "org.python:jython-standalone:2.7.1" dependency "org.mozilla:rhino:1.7.11" dependency("org.dom4j:dom4j:2.1.3") { exclude group: 'javax.xml.bind', name: "jaxb-api" exclude group: "jaxen", name: "jaxen" exclude group: "net.java.dev.msv", name: "xsdlib" exclude group: "pull-parser", name: "pull-parser" exclude group: "xpp3", name: "xpp3" } dependency("jaxen:jaxen:1.2.0") { exclude group: "dom4j", name: "dom4j" } dependency("junit:junit:4.13.2") { exclude group: "org.hamcrest", name: "hamcrest-core" } dependency("de.bechte.junit:junit-hierarchicalcontextrunner:4.12.1") { exclude group: "junit", name: "junit" } dependency "org.testng:testng:7.4.0" dependency "org.junit.support:testng-engine:1.0.1" dependency "org.hamcrest:hamcrest:2.1" dependency "org.awaitility:awaitility:3.1.6" dependency "org.assertj:assertj-core:3.22.0" dependencySet(group: 'org.xmlunit', version: '2.9.0') { entry 'xmlunit-assertj' entry('xmlunit-matchers') { exclude group: "org.hamcrest", name: "hamcrest-core" } } dependencySet(group: 'org.mockito', version: '4.5.1') { entry('mockito-core') { exclude group: "org.hamcrest", name: "hamcrest-core" } entry 'mockito-junit-jupiter' } dependency "io.mockk:mockk:1.12.1" dependency("net.sourceforge.htmlunit:htmlunit:2.61.0") { exclude group: "commons-logging", name: "commons-logging" } dependency("org.seleniumhq.selenium:htmlunit-driver:2.61.0") { exclude group: "commons-logging", name: "commons-logging" } dependency("org.seleniumhq.selenium:selenium-java:3.141.59") { exclude group: "commons-logging", name: "commons-logging" exclude group: "io.netty", name: "netty" } dependency "org.skyscreamer:jsonassert:1.5.0" dependency "com.jayway.jsonpath:json-path:2.6.0" dependency "org.bouncycastle:bcpkix-jdk15on:1.66" dependency "javax.cache:cache-api:1.1.1" dependency "javax.money:money-api:1.1" dependency "org.javamoney:moneta:1.4.2" dependency "jakarta.activation:jakarta.activation-api:2.0.1" dependency "jakarta.annotation:jakarta.annotation-api:2.0.0" dependency "jakarta.ejb:jakarta.ejb-api:4.0.0" dependency "jakarta.el:jakarta.el-api:4.0.0" dependency "jakarta.enterprise.concurrent:jakarta.enterprise.concurrent-api:2.0.0" dependency "jakarta.faces:jakarta.faces-api:3.0.0" dependency "jakarta.inject:jakarta.inject-api:2.0.0" dependency "jakarta.inject:jakarta.inject-tck:2.0.1" dependency "jakarta.interceptor:jakarta.interceptor-api:2.0.0" dependency "jakarta.jms:jakarta.jms-api:3.0.0" dependency "jakarta.json:jakarta.json-api:2.0.1" dependency "jakarta.json.bind:jakarta.json.bind-api:2.0.0" dependency "jakarta.mail:jakarta.mail-api:2.0.1" dependency "jakarta.persistence:jakarta.persistence-api:3.0.0" dependency "jakarta.resource:jakarta.resource-api:2.0.0" dependency "jakarta.servlet:jakarta.servlet-api:5.0.0" dependency "jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.0.0" dependency "jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:2.0.0" dependency "jakarta.transaction:jakarta.transaction-api:2.0.0" dependency "jakarta.validation:jakarta.validation-api:3.0.0" dependency "jakarta.websocket:jakarta.websocket-api:2.0.0" dependency "jakarta.xml.bind:jakarta.xml.bind-api:3.0.1" dependency "com.sun.activation:jakarta.activation:2.0.1" dependency "com.sun.mail:jakarta.mail:2.0.1" dependencySet(group: 'com.sun.xml.bind', version: '3.0.2') { entry 'jaxb-core' entry 'jaxb-impl' entry 'jaxb-xjc' } // Substitute for "javax.management:jmxremote_optional:1.0.1_04" which // is not available on Maven Central dependency "org.glassfish.external:opendmk_jmxremote_optional_jar:1.0-b01-ea" dependency "org.glassfish:jakarta.el:4.0.2" dependency "org.glassfish.tyrus:tyrus-container-servlet:2.0.1" dependency "org.eclipse.persistence:org.eclipse.persistence.jpa:3.0.2" } generatedPomCustomization { enabled = false } resolutionStrategy { cacheChangingModulesFor 0, "seconds" } repositories { mavenCentral() maven { url "https://repo.spring.io/libs-spring-framework-build" } maven { url "https://repo.spring.io/milestone"} } } 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.compile' apply from: "${rootDir}/gradle/toolchains.gradle" apply from: "${rootDir}/gradle/ide.gradle" pluginManager.withPlugin("kotlin") { apply plugin: "org.jetbrains.dokka" apply from: "${rootDir}/gradle/docs-dokka.gradle" compileKotlin { kotlinOptions { languageVersion = "1.6" apiVersion = "1.6" freeCompilerArgs = ["-Xjsr305=strict", "-Xsuppress-version-warnings", "-opt-in=kotlin.RequiresOptIn"] allWarningsAsErrors = true } } compileTestKotlin { kotlinOptions { freeCompilerArgs = ["-Xjsr305=strict", "-opt-in=kotlin.RequiresOptIn"] } } } test { useJUnitPlatform() include(["**/*Tests.class", "**/*Test.class"]) systemProperty("java.awt.headless", "true") systemProperty("testGroups", project.properties.get("testGroups")) systemProperty("io.netty.leakDetection.level", "paranoid") } checkstyle { toolVersion = "10.1" configDirectory.set(rootProject.file("src/checkstyle")) } dependencies { 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") } 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://fasterxml.github.io/jackson-core/javadoc/2.10/", "https://fasterxml.github.io/jackson-databind/javadoc/2.10/", "https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.10/", "https://hc.apache.org/httpcomponents-client-5.1.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.8.1/api/ are in named modules. // // "https://junit.org/junit5/docs/5.8.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/0.9.1.RELEASE/api/", // 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/" ] as String[] } configure(moduleProjects) { project -> apply from: "${rootDir}/gradle/spring-module.gradle" } configure(rootProject) { description = "Spring Framework" apply plugin: "kotlin" apply plugin: "io.spring.nohttp" apply plugin: 'org.springframework.build.api-diff' apply from: "${rootDir}/gradle/publications.gradle" apply from: "${rootDir}/gradle/docs.gradle" 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" } } } publishing { publications { mavenJava(MavenPublication) { artifact docsZip artifact schemaZip artifact distZip } } } }