diff --git a/build.gradle b/build.gradle index ce87ff0fa8f..3176b67fcae 100644 --- a/build.gradle +++ b/build.gradle @@ -14,20 +14,13 @@ plugins { id 'org.springframework.build.test-sources' apply false id "io.spring.dependency-management" version "1.0.7.RELEASE" apply false id "org.jetbrains.kotlin.jvm" version "1.3.41" apply false - id "org.jetbrains.dokka" version "0.9.18" + id "org.jetbrains.dokka" version "0.9.18" apply false 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 != "spring-framework-bom") && (it.name != "spring-core-coroutines") + (it.name != "spring-framework-bom") && (it.name != "spring-core-coroutines") && (it.name != "integration-tests") } aspectjVersion = "1.9.4" @@ -51,7 +44,6 @@ ext { tomcatVersion = "9.0.22" undertowVersion = "2.0.23.Final" - gradleScriptDir = "${rootProject.projectDir}/gradle" withoutJclOverSlf4j = { exclude group: "org.slf4j", module: "jcl-over-slf4j" } @@ -61,13 +53,10 @@ configure(allprojects) { project -> group = "org.springframework" apply plugin: "java" - apply plugin: "kotlin" apply plugin: "checkstyle" apply plugin: 'org.springframework.build.compile' - apply plugin: 'org.springframework.build.optional-dependencies' - apply plugin: 'org.springframework.build.test-sources' apply plugin: "io.spring.dependency-management" - apply from: "${gradleScriptDir}/ide.gradle" + apply from: "${rootDir}/gradle/ide.gradle" dependencyManagement { resolutionStrategy { @@ -96,17 +85,19 @@ configure(allprojects) { project -> } } - compileKotlin { - kotlinOptions { - jvmTarget = "1.8" - freeCompilerArgs = ["-Xjsr305=strict"] + pluginManager.withPlugin("kotlin") { + apply plugin: "org.jetbrains.dokka" + compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + freeCompilerArgs = ["-Xjsr305=strict"] + } } - } - - compileTestKotlin { - kotlinOptions { - jvmTarget = "1.8" - freeCompilerArgs = ["-Xjsr305=strict"] + compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + freeCompilerArgs = ["-Xjsr305=strict"] + } } } @@ -179,67 +170,18 @@ configure(allprojects) { project -> ] as String[] } -configure(subprojects.findAll { (it.name != "spring-core-coroutines" - && it.name != "spring-integration-tests") } ) { 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(moduleProjects) { project -> + apply from: "${rootDir}/gradle/spring-module.gradle" } configure(rootProject) { description = "Spring Framework" apply plugin: "groovy" + apply plugin: "kotlin" apply plugin: "io.spring.nohttp" apply plugin: 'org.springframework.build.api-diff' - apply from: "${gradleScriptDir}/docs.gradle" + apply from: "${rootDir}/gradle/docs.gradle" nohttp { source.exclude "**/test-output/**" @@ -258,9 +200,6 @@ configure(rootProject) { } } - // Don't publish the default jar for the root project - configurations.archives.artifacts.clear() - dependencies { asciidoctor("io.spring.asciidoctor:spring-asciidoctor-extensions:0.1.3.RELEASE") } @@ -270,6 +209,5 @@ configure(rootProject) { archives schemaZip archives distZip } - } diff --git a/gradle/docs.gradle b/gradle/docs.gradle index 7f46e9c440b..b6ce3e75635 100644 --- a/gradle/docs.gradle +++ b/gradle/docs.gradle @@ -1,76 +1,72 @@ -/* - * Copyright 2002-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +/** + * Produce Javadoc for all Spring Framework modules in "build/docs/javadoc" */ - task api(type: Javadoc) { group = "Documentation" description = "Generates aggregated Javadoc API documentation." title = "${rootProject.description} ${version} API" dependsOn { - subprojects.collect { + moduleProjects.collect { it.tasks.getByName("jar") } } - options.encoding = "UTF-8" - options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED - options.author = true - options.header = rootProject.description - options.use = true - options.overview = "src/docs/api/overview.html" - options.stylesheetFile = file("src/docs/api/stylesheet.css") - options.splitIndex = true - options.links(project.ext.javadocLinks) - options.addStringOption('Xdoclint:none', '-quiet') - - source subprojects.collect { project -> - project.sourceSets.main.allJava - } - - maxMemory = "1024m" - destinationDir = new File(buildDir, "api") - doFirst { classpath = files( // ensure the javadoc process can resolve types compiled from .aj sources project(":spring-aspects").sourceSets.main.output ) - classpath += files(subprojects.collect { it.sourceSets.main.compileClasspath }) + classpath += files(moduleProjects.collect { it.sourceSets.main.compileClasspath }) + } + + options { + encoding = "UTF-8" + memberLevel = JavadocMemberLevel.PROTECTED + author = true + header = rootProject.description + use = true + overview = "src/docs/api/overview.html" + stylesheetFile = file("src/docs/api/stylesheet.css") + splitIndex = true + links(project.ext.javadocLinks) + addStringOption('Xdoclint:none', '-quiet') + if(JavaVersion.current().isJava9Compatible()) { + addBooleanOption('html5', true) + } } + source moduleProjects.collect { project -> + project.sourceSets.main.allJava + } + maxMemory = "1024m" + destinationDir = file("$buildDir/docs/javadoc") } +/** + * Produce KDoc for all Spring Framework modules in "build/docs/kdoc" + */ dokka { dependsOn { tasks.getByName("api") } doFirst { - classpath = subprojects.collect { project -> project.jar.outputs.files.getFiles() }.flatten() - classpath += files(subprojects.collect { it.sourceSets.main.compileClasspath }) - + classpath = moduleProjects.collect { project -> project.jar.outputs.files.getFiles() }.flatten() + classpath += files(moduleProjects.collect { it.sourceSets.main.compileClasspath }) + sourceDirs = files(moduleProjects + .findAll { + it.pluginManager.hasPlugin("kotlin") + } + .collect { project -> + def kotlinDirs = project.sourceSets.main.kotlin.srcDirs.collect() + kotlinDirs -= project.sourceSets.main.java.srcDirs + }) } moduleName = "spring-framework" outputFormat = "html" outputDirectory = "$buildDir/docs/kdoc" - sourceDirs = files(subprojects.collect { project -> - def kotlinDirs = project.sourceSets.main.kotlin.srcDirs.collect() - kotlinDirs -= project.sourceSets.main.java.srcDirs - }) externalDocumentationLink { url = new URL("https://docs.spring.io/spring-framework/docs/$version/javadoc-api/") - packageListUrl = new File(buildDir, "api/package-list").toURI().toURL() + packageListUrl = new File(buildDir, "docs/javadoc/package-list").toURI().toURL() } externalDocumentationLink { url = new URL("https://projectreactor.io/docs/core/release/api/") @@ -101,6 +97,10 @@ task extractDocResources(type: Sync) { into "$buildDir/asciidoc/build" } +/** + * Produce the Spring Framework Reference documentation + * from "src/docs/asciidoc" into "build/asciidoc/html5" + */ asciidoctor { sourceDir "$buildDir/asciidoc/build" sources { @@ -136,52 +136,54 @@ asciidoctor { asciidoctor.dependsOn extractDocResources +/** + * Zip all docs (API and reference) into a single archive + */ task docsZip(type: Zip, dependsOn: ['api', 'asciidoctor', 'dokka']) { group = "Distribution" - baseName = "spring-framework" - classifier = "docs" - description = "Builds -${classifier} archive containing api and reference " + + description = "Builds -${archiveClassifier} archive containing api and reference " + "for deployment at https://docs.spring.io/spring-framework/docs." + archiveBaseName.set("spring-framework") + archiveClassifier.set("docs") from("src/dist") { include "changelog.txt" } - from (api) { into "javadoc-api" } - from ("$asciidoctor.outputDir/html5") { into "spring-framework-reference" } - from ("$asciidoctor.outputDir/pdf") { into "spring-framework-reference/pdf" } - from (dokka) { into "kdoc-api" } } +/** + * Zip all Spring Framework schemas into a single archive + */ task schemaZip(type: Zip) { group = "Distribution" - baseName = "spring-framework" - classifier = "schema" - description = "Builds -${classifier} archive containing all " + + archiveBaseName.set("spring-framework") + archiveClassifier.set("schema") + description = "Builds -${archiveClassifier} archive containing all " + "XSDs for deployment at https://springframework.org/schema." - duplicatesStrategy 'exclude' - moduleProjects.each { subproject -> + duplicatesStrategy DuplicatesStrategy.EXCLUDE + moduleProjects.each { module -> def Properties schemas = new Properties(); - subproject.sourceSets.main.resources.find { + module.sourceSets.main.resources.find { it.path.endsWith("META-INF/spring.schemas") }?.withInputStream { schemas.load(it) } for (def key : schemas.keySet()) { def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') assert shortName != key - File xsdFile = subproject.sourceSets.main.resources.find { + File xsdFile = module.sourceSets.main.resources.find { it.path.endsWith(schemas.get(key)) } assert xsdFile != null @@ -192,15 +194,19 @@ task schemaZip(type: Zip) { } } +/** + * Create a distribution zip with everything: + * docs, schemas, jars, source jars, javadoc jars + */ task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) { group = "Distribution" - baseName = "spring-framework" - classifier = "dist" - description = "Builds -${classifier} archive, containing all jars and docs, " + + archiveBaseName.set("spring-framework") + archiveClassifier.set("dist") + description = "Builds -${archiveClassifier} archive, containing all jars and docs, " + "suitable for community download page." - ext.baseDir = "${baseName}-${project.version}"; + ext.baseDir = "${archiveBaseName}-${project.version}"; from("src/docs/dist") { include "readme.txt" @@ -218,49 +224,17 @@ task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) { into "${baseDir}/schema" } - moduleProjects.each { subproject -> + moduleProjects.each { module -> into ("${baseDir}/libs") { - from subproject.jar - if (subproject.tasks.findByPath("sourcesJar")) { - from subproject.sourcesJar + from module.jar + if (module.tasks.findByPath("sourcesJar")) { + from module.sourcesJar } - if (subproject.tasks.findByPath("javadocJar")) { - from subproject.javadocJar + if (module.tasks.findByPath("javadocJar")) { + from module.javadocJar } } } } -distZip.mustRunAfter subprojects.test - -// Create a distribution that contains all dependencies (required and optional). -// Not published by default; only for use when building from source. -task depsZip(type: Zip, dependsOn: distZip) { zipTask -> - group = "Distribution" - baseName = "spring-framework" - classifier = "dist-with-deps" - description = "Builds -${classifier} archive, containing everything " + - "in the -${distZip.classifier} archive plus all runtime dependencies." - - from zipTree(distZip.archivePath) - - gradle.taskGraph.whenReady { taskGraph -> - if (taskGraph.hasTask(":${zipTask.name}")) { - def projectNames = rootProject.subprojects*.name - def artifacts = new HashSet() - subprojects.each { subproject -> - (subproject.configurations.runtime.resolvedConfiguration.resolvedArtifacts + - subproject.configurations.optional.resolvedConfiguration.resolvedArtifacts).each { artifact -> - def dependency = artifact.moduleVersion.id - if (!projectNames.contains(dependency.name)) { - artifacts << artifact.file - } - } - } - - zipTask.from(artifacts) { - into "${distZip.baseDir}/deps" - } - } - } -} +distZip.mustRunAfter moduleProjects.check diff --git a/gradle/publish-maven.gradle b/gradle/spring-module.gradle similarity index 50% rename from gradle/publish-maven.gradle rename to gradle/spring-module.gradle index eb429bb57ec..c817ea51900 100644 --- a/gradle/publish-maven.gradle +++ b/gradle/spring-module.gradle @@ -1,5 +1,57 @@ +apply plugin: 'org.springframework.build.compile' +apply plugin: 'org.springframework.build.optional-dependencies' +apply plugin: 'org.springframework.build.test-sources' apply plugin: "maven" +jar { + manifest.attributes["Implementation-Title"] = project.name + manifest.attributes["Implementation-Version"] = project.version + manifest.attributes["Automatic-Module-Name"] = project.name.replace('-', '.') // for Jigsaw + manifest.attributes["Created-By"] = + "${System.getProperty("java.version")} (${System.getProperty("java.specification.vendor")})" + + from("${rootDir}/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 = 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 + archiveClassifier.set("sources") + from sourceSets.main.allSource + // Don't include or exclude anything explicitly by default. See SPR-12085. +} + +task javadocJar(type: Jar) { + archiveClassifier.set("javadoc") + from javadoc +} + +artifacts { + archives sourcesJar + archives javadocJar +} + install { repositories.mavenInstaller { customizePom(pom, project) diff --git a/integration-tests/integration-tests.gradle b/integration-tests/integration-tests.gradle index c411245ee14..4fef2249f6c 100644 --- a/integration-tests/integration-tests.gradle +++ b/integration-tests/integration-tests.gradle @@ -1,5 +1,7 @@ description = "Spring Integration Tests" +apply plugin: "org.springframework.build.test-sources" + dependencies { testCompile(project(":spring-aop")) testCompile(project(":spring-beans")) diff --git a/spring-beans/spring-beans.gradle b/spring-beans/spring-beans.gradle index 5cf65df4048..9264a18c4a4 100644 --- a/spring-beans/spring-beans.gradle +++ b/spring-beans/spring-beans.gradle @@ -1,6 +1,7 @@ description = "Spring Beans" apply plugin: "groovy" +apply plugin: "kotlin" dependencies { compile(project(":spring-core")) diff --git a/spring-context/spring-context.gradle b/spring-context/spring-context.gradle index 4b6b966e130..84186ce5c99 100644 --- a/spring-context/spring-context.gradle +++ b/spring-context/spring-context.gradle @@ -1,6 +1,7 @@ description = "Spring Context" apply plugin: "groovy" +apply plugin: "kotlin" dependencyManagement { imports { diff --git a/spring-core-coroutines/spring-core-coroutines.gradle b/spring-core-coroutines/spring-core-coroutines.gradle index 7a8747c381b..5fa2184862d 100644 --- a/spring-core-coroutines/spring-core-coroutines.gradle +++ b/spring-core-coroutines/spring-core-coroutines.gradle @@ -1,5 +1,7 @@ description = "Spring Core Coroutines support" +apply plugin: "kotlin" + dependencies { compile("org.jetbrains.kotlin:kotlin-reflect") compile("org.jetbrains.kotlin:kotlin-stdlib") @@ -8,6 +10,11 @@ dependencies { compile("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") } +// Avoid publishing coroutines JAR to the artifact repository +if (project.hasProperty("artifactoryPublish")) { + artifactoryPublish.skip = true +} + eclipse { project { buildCommand "org.jetbrains.kotlin.ui.kotlinBuilder" diff --git a/spring-core/spring-core.gradle b/spring-core/spring-core.gradle index 2d4abb9e7e5..7014bae4d40 100644 --- a/spring-core/spring-core.gradle +++ b/spring-core/spring-core.gradle @@ -1,5 +1,7 @@ description = "Spring Core" +apply plugin: "kotlin" + dependencyManagement { imports { mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" diff --git a/spring-framework-bom/spring-framework-bom.gradle b/spring-framework-bom/spring-framework-bom.gradle index d748629ca43..8cbd3d7f695 100644 --- a/spring-framework-bom/spring-framework-bom.gradle +++ b/spring-framework-bom/spring-framework-bom.gradle @@ -1,5 +1,7 @@ description = "Spring Framework (Bill of Materials)" +apply plugin: "maven" + configurations.archives.artifacts.clear() artifacts { // work around GRADLE-2406 by attaching text artifact diff --git a/spring-jdbc/spring-jdbc.gradle b/spring-jdbc/spring-jdbc.gradle index 2339e0828cf..9064f4f1260 100644 --- a/spring-jdbc/spring-jdbc.gradle +++ b/spring-jdbc/spring-jdbc.gradle @@ -1,5 +1,7 @@ description = "Spring JDBC" +apply plugin: "kotlin" + dependencies { compile(project(":spring-beans")) compile(project(":spring-core")) diff --git a/spring-messaging/spring-messaging.gradle b/spring-messaging/spring-messaging.gradle index 05aa3c16df1..c244b398ffc 100644 --- a/spring-messaging/spring-messaging.gradle +++ b/spring-messaging/spring-messaging.gradle @@ -1,5 +1,7 @@ description = "Spring Messaging" +apply plugin: "kotlin" + dependencyManagement { imports { mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" diff --git a/spring-test/spring-test.gradle b/spring-test/spring-test.gradle index 5fe51cddfd5..824db3a58cf 100644 --- a/spring-test/spring-test.gradle +++ b/spring-test/spring-test.gradle @@ -1,5 +1,7 @@ description = "Spring TestContext Framework" +apply plugin: "kotlin" + dependencyManagement { imports { mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" diff --git a/spring-web/spring-web.gradle b/spring-web/spring-web.gradle index e5917f37820..dedb35a107d 100644 --- a/spring-web/spring-web.gradle +++ b/spring-web/spring-web.gradle @@ -1,5 +1,7 @@ description = "Spring Web" +apply plugin: "kotlin" + dependencyManagement { imports { mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" diff --git a/spring-webflux/spring-webflux.gradle b/spring-webflux/spring-webflux.gradle index 16e2beaf3e9..9fe8f05803d 100644 --- a/spring-webflux/spring-webflux.gradle +++ b/spring-webflux/spring-webflux.gradle @@ -1,5 +1,7 @@ description = "Spring WebFlux" +apply plugin: "kotlin" + dependencyManagement { imports { mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" diff --git a/spring-webmvc/spring-webmvc.gradle b/spring-webmvc/spring-webmvc.gradle index 8ca041483fb..832970cc2de 100644 --- a/spring-webmvc/spring-webmvc.gradle +++ b/spring-webmvc/spring-webmvc.gradle @@ -1,5 +1,7 @@ description = "Spring Web MVC" +apply plugin: "kotlin" + dependencyManagement { imports { mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"