提交 e9523161 编写于 作者: B Brian Clozel

Revert "Revert "Refactor Gradle tasks in Spring Framework build""

This reverts commit fb0d6187.
上级 fb0d6187
...@@ -14,20 +14,13 @@ plugins { ...@@ -14,20 +14,13 @@ plugins {
id 'org.springframework.build.test-sources' apply false id 'org.springframework.build.test-sources' apply false
id "io.spring.dependency-management" version "1.0.7.RELEASE" 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.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" id "org.asciidoctor.convert" version "1.5.8"
} }
ext { 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 { 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" aspectjVersion = "1.9.4"
...@@ -51,7 +44,6 @@ ext { ...@@ -51,7 +44,6 @@ ext {
tomcatVersion = "9.0.22" tomcatVersion = "9.0.22"
undertowVersion = "2.0.23.Final" undertowVersion = "2.0.23.Final"
gradleScriptDir = "${rootProject.projectDir}/gradle"
withoutJclOverSlf4j = { withoutJclOverSlf4j = {
exclude group: "org.slf4j", module: "jcl-over-slf4j" exclude group: "org.slf4j", module: "jcl-over-slf4j"
} }
...@@ -61,13 +53,10 @@ configure(allprojects) { project -> ...@@ -61,13 +53,10 @@ configure(allprojects) { project ->
group = "org.springframework" group = "org.springframework"
apply plugin: "java" apply plugin: "java"
apply plugin: "kotlin"
apply plugin: "checkstyle" apply plugin: "checkstyle"
apply plugin: 'org.springframework.build.compile' 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 plugin: "io.spring.dependency-management"
apply from: "${gradleScriptDir}/ide.gradle" apply from: "${rootDir}/gradle/ide.gradle"
dependencyManagement { dependencyManagement {
resolutionStrategy { resolutionStrategy {
...@@ -96,17 +85,19 @@ configure(allprojects) { project -> ...@@ -96,17 +85,19 @@ configure(allprojects) { project ->
} }
} }
compileKotlin { pluginManager.withPlugin("kotlin") {
kotlinOptions { apply plugin: "org.jetbrains.dokka"
jvmTarget = "1.8" compileKotlin {
freeCompilerArgs = ["-Xjsr305=strict"] kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
}
} }
} compileTestKotlin {
kotlinOptions {
compileTestKotlin { jvmTarget = "1.8"
kotlinOptions { freeCompilerArgs = ["-Xjsr305=strict"]
jvmTarget = "1.8" }
freeCompilerArgs = ["-Xjsr305=strict"]
} }
} }
...@@ -179,67 +170,18 @@ configure(allprojects) { project -> ...@@ -179,67 +170,18 @@ configure(allprojects) { project ->
] as String[] ] as String[]
} }
configure(subprojects.findAll { (it.name != "spring-core-coroutines" configure(moduleProjects) { project ->
&& it.name != "spring-integration-tests") } ) { subproject -> apply from: "${rootDir}/gradle/spring-module.gradle"
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) { configure(rootProject) {
description = "Spring Framework" description = "Spring Framework"
apply plugin: "groovy" apply plugin: "groovy"
apply plugin: "kotlin"
apply plugin: "io.spring.nohttp" apply plugin: "io.spring.nohttp"
apply plugin: 'org.springframework.build.api-diff' apply plugin: 'org.springframework.build.api-diff'
apply from: "${gradleScriptDir}/docs.gradle" apply from: "${rootDir}/gradle/docs.gradle"
nohttp { nohttp {
source.exclude "**/test-output/**" source.exclude "**/test-output/**"
...@@ -258,9 +200,6 @@ configure(rootProject) { ...@@ -258,9 +200,6 @@ configure(rootProject) {
} }
} }
// Don't publish the default jar for the root project
configurations.archives.artifacts.clear()
dependencies { dependencies {
asciidoctor("io.spring.asciidoctor:spring-asciidoctor-extensions:0.1.3.RELEASE") asciidoctor("io.spring.asciidoctor:spring-asciidoctor-extensions:0.1.3.RELEASE")
} }
...@@ -270,6 +209,5 @@ configure(rootProject) { ...@@ -270,6 +209,5 @@ configure(rootProject) {
archives schemaZip archives schemaZip
archives distZip archives distZip
} }
} }
/* /**
* Copyright 2002-2019 the original author or authors. * Produce Javadoc for all Spring Framework modules in "build/docs/javadoc"
*
* 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.
*/ */
task api(type: Javadoc) { task api(type: Javadoc) {
group = "Documentation" group = "Documentation"
description = "Generates aggregated Javadoc API documentation." description = "Generates aggregated Javadoc API documentation."
title = "${rootProject.description} ${version} API" title = "${rootProject.description} ${version} API"
dependsOn { dependsOn {
subprojects.collect { moduleProjects.collect {
it.tasks.getByName("jar") 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 { doFirst {
classpath = files( classpath = files(
// ensure the javadoc process can resolve types compiled from .aj sources // ensure the javadoc process can resolve types compiled from .aj sources
project(":spring-aspects").sourceSets.main.output 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 { dokka {
dependsOn { dependsOn {
tasks.getByName("api") tasks.getByName("api")
} }
doFirst { doFirst {
classpath = subprojects.collect { project -> project.jar.outputs.files.getFiles() }.flatten() classpath = moduleProjects.collect { project -> project.jar.outputs.files.getFiles() }.flatten()
classpath += files(subprojects.collect { it.sourceSets.main.compileClasspath }) 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" moduleName = "spring-framework"
outputFormat = "html" outputFormat = "html"
outputDirectory = "$buildDir/docs/kdoc" outputDirectory = "$buildDir/docs/kdoc"
sourceDirs = files(subprojects.collect { project ->
def kotlinDirs = project.sourceSets.main.kotlin.srcDirs.collect()
kotlinDirs -= project.sourceSets.main.java.srcDirs
})
externalDocumentationLink { externalDocumentationLink {
url = new URL("https://docs.spring.io/spring-framework/docs/$version/javadoc-api/") 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 { externalDocumentationLink {
url = new URL("https://projectreactor.io/docs/core/release/api/") url = new URL("https://projectreactor.io/docs/core/release/api/")
...@@ -101,6 +97,10 @@ task extractDocResources(type: Sync) { ...@@ -101,6 +97,10 @@ task extractDocResources(type: Sync) {
into "$buildDir/asciidoc/build" into "$buildDir/asciidoc/build"
} }
/**
* Produce the Spring Framework Reference documentation
* from "src/docs/asciidoc" into "build/asciidoc/html5"
*/
asciidoctor { asciidoctor {
sourceDir "$buildDir/asciidoc/build" sourceDir "$buildDir/asciidoc/build"
sources { sources {
...@@ -136,52 +136,54 @@ asciidoctor { ...@@ -136,52 +136,54 @@ asciidoctor {
asciidoctor.dependsOn extractDocResources asciidoctor.dependsOn extractDocResources
/**
* Zip all docs (API and reference) into a single archive
*/
task docsZip(type: Zip, dependsOn: ['api', 'asciidoctor', 'dokka']) { task docsZip(type: Zip, dependsOn: ['api', 'asciidoctor', 'dokka']) {
group = "Distribution" group = "Distribution"
baseName = "spring-framework" description = "Builds -${archiveClassifier} archive containing api and reference " +
classifier = "docs"
description = "Builds -${classifier} archive containing api and reference " +
"for deployment at https://docs.spring.io/spring-framework/docs." "for deployment at https://docs.spring.io/spring-framework/docs."
archiveBaseName.set("spring-framework")
archiveClassifier.set("docs")
from("src/dist") { from("src/dist") {
include "changelog.txt" include "changelog.txt"
} }
from (api) { from (api) {
into "javadoc-api" into "javadoc-api"
} }
from ("$asciidoctor.outputDir/html5") { from ("$asciidoctor.outputDir/html5") {
into "spring-framework-reference" into "spring-framework-reference"
} }
from ("$asciidoctor.outputDir/pdf") { from ("$asciidoctor.outputDir/pdf") {
into "spring-framework-reference/pdf" into "spring-framework-reference/pdf"
} }
from (dokka) { from (dokka) {
into "kdoc-api" into "kdoc-api"
} }
} }
/**
* Zip all Spring Framework schemas into a single archive
*/
task schemaZip(type: Zip) { task schemaZip(type: Zip) {
group = "Distribution" group = "Distribution"
baseName = "spring-framework" archiveBaseName.set("spring-framework")
classifier = "schema" archiveClassifier.set("schema")
description = "Builds -${classifier} archive containing all " + description = "Builds -${archiveClassifier} archive containing all " +
"XSDs for deployment at https://springframework.org/schema." "XSDs for deployment at https://springframework.org/schema."
duplicatesStrategy 'exclude' duplicatesStrategy DuplicatesStrategy.EXCLUDE
moduleProjects.each { subproject -> moduleProjects.each { module ->
def Properties schemas = new Properties(); def Properties schemas = new Properties();
subproject.sourceSets.main.resources.find { module.sourceSets.main.resources.find {
it.path.endsWith("META-INF/spring.schemas") it.path.endsWith("META-INF/spring.schemas")
}?.withInputStream { schemas.load(it) } }?.withInputStream { schemas.load(it) }
for (def key : schemas.keySet()) { for (def key : schemas.keySet()) {
def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1') def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')
assert shortName != key assert shortName != key
File xsdFile = subproject.sourceSets.main.resources.find { File xsdFile = module.sourceSets.main.resources.find {
it.path.endsWith(schemas.get(key)) it.path.endsWith(schemas.get(key))
} }
assert xsdFile != null assert xsdFile != null
...@@ -192,15 +194,19 @@ task schemaZip(type: Zip) { ...@@ -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]) { task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) {
group = "Distribution" group = "Distribution"
baseName = "spring-framework" archiveBaseName.set("spring-framework")
classifier = "dist" archiveClassifier.set("dist")
description = "Builds -${classifier} archive, containing all jars and docs, " + description = "Builds -${archiveClassifier} archive, containing all jars and docs, " +
"suitable for community download page." "suitable for community download page."
ext.baseDir = "${baseName}-${project.version}"; ext.baseDir = "${archiveBaseName}-${project.version}";
from("src/docs/dist") { from("src/docs/dist") {
include "readme.txt" include "readme.txt"
...@@ -218,49 +224,17 @@ task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) { ...@@ -218,49 +224,17 @@ task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) {
into "${baseDir}/schema" into "${baseDir}/schema"
} }
moduleProjects.each { subproject -> moduleProjects.each { module ->
into ("${baseDir}/libs") { into ("${baseDir}/libs") {
from subproject.jar from module.jar
if (subproject.tasks.findByPath("sourcesJar")) { if (module.tasks.findByPath("sourcesJar")) {
from subproject.sourcesJar from module.sourcesJar
} }
if (subproject.tasks.findByPath("javadocJar")) { if (module.tasks.findByPath("javadocJar")) {
from subproject.javadocJar from module.javadocJar
} }
} }
} }
} }
distZip.mustRunAfter subprojects.test distZip.mustRunAfter moduleProjects.check
// 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"
}
}
}
}
apply plugin: 'org.springframework.build.compile'
apply plugin: 'org.springframework.build.optional-dependencies'
apply plugin: 'org.springframework.build.test-sources'
apply plugin: "maven" 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 { install {
repositories.mavenInstaller { repositories.mavenInstaller {
customizePom(pom, project) customizePom(pom, project)
......
description = "Spring Integration Tests" description = "Spring Integration Tests"
apply plugin: "org.springframework.build.test-sources"
dependencies { dependencies {
testCompile(project(":spring-aop")) testCompile(project(":spring-aop"))
testCompile(project(":spring-beans")) testCompile(project(":spring-beans"))
......
description = "Spring Beans" description = "Spring Beans"
apply plugin: "groovy" apply plugin: "groovy"
apply plugin: "kotlin"
dependencies { dependencies {
compile(project(":spring-core")) compile(project(":spring-core"))
......
description = "Spring Context" description = "Spring Context"
apply plugin: "groovy" apply plugin: "groovy"
apply plugin: "kotlin"
dependencyManagement { dependencyManagement {
imports { imports {
......
description = "Spring Core Coroutines support" description = "Spring Core Coroutines support"
apply plugin: "kotlin"
dependencies { dependencies {
compile("org.jetbrains.kotlin:kotlin-reflect") compile("org.jetbrains.kotlin:kotlin-reflect")
compile("org.jetbrains.kotlin:kotlin-stdlib") compile("org.jetbrains.kotlin:kotlin-stdlib")
...@@ -8,6 +10,11 @@ dependencies { ...@@ -8,6 +10,11 @@ dependencies {
compile("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") compile("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
} }
// Avoid publishing coroutines JAR to the artifact repository
if (project.hasProperty("artifactoryPublish")) {
artifactoryPublish.skip = true
}
eclipse { eclipse {
project { project {
buildCommand "org.jetbrains.kotlin.ui.kotlinBuilder" buildCommand "org.jetbrains.kotlin.ui.kotlinBuilder"
......
description = "Spring Core" description = "Spring Core"
apply plugin: "kotlin"
dependencyManagement { dependencyManagement {
imports { imports {
mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"
......
description = "Spring Framework (Bill of Materials)" description = "Spring Framework (Bill of Materials)"
apply plugin: "maven"
configurations.archives.artifacts.clear() configurations.archives.artifacts.clear()
artifacts { artifacts {
// work around GRADLE-2406 by attaching text artifact // work around GRADLE-2406 by attaching text artifact
......
description = "Spring JDBC" description = "Spring JDBC"
apply plugin: "kotlin"
dependencies { dependencies {
compile(project(":spring-beans")) compile(project(":spring-beans"))
compile(project(":spring-core")) compile(project(":spring-core"))
......
description = "Spring Messaging" description = "Spring Messaging"
apply plugin: "kotlin"
dependencyManagement { dependencyManagement {
imports { imports {
mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"
......
description = "Spring TestContext Framework" description = "Spring TestContext Framework"
apply plugin: "kotlin"
dependencyManagement { dependencyManagement {
imports { imports {
mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"
......
description = "Spring Web" description = "Spring Web"
apply plugin: "kotlin"
dependencyManagement { dependencyManagement {
imports { imports {
mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"
......
description = "Spring WebFlux" description = "Spring WebFlux"
apply plugin: "kotlin"
dependencyManagement { dependencyManagement {
imports { imports {
mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"
......
description = "Spring Web MVC" description = "Spring Web MVC"
apply plugin: "kotlin"
dependencyManagement { dependencyManagement {
imports { imports {
mavenBom "io.projectreactor:reactor-bom:${reactorVersion}" mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册