diff --git a/build.gradle b/build.gradle index 7ac9fe21cb..c7c858ed61 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ buildscript { // 3rd party plugin repositories can be configured in settings.gradle 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" @@ -27,7 +28,7 @@ ext { linkScmDevConnection = "scm:git:ssh://git@github.com:spring-projects/spring-framework.git" moduleProjects = subprojects.findAll { - (it.name != "spring-build-src") && (it.name != "spring-framework-bom") && (it.name != "spring-core-coroutines") + (it.name != "spring-framework-bom") && (it.name != "spring-core-coroutines") } aspectjVersion = "1.9.4" @@ -65,7 +66,7 @@ configure(allprojects) { project -> apply plugin: "kotlin" apply plugin: "checkstyle" apply plugin: "propdeps" - apply plugin: "test-source-set-dependencies" + apply plugin: 'org.springframework.build.test-sources' apply plugin: "io.spring.dependency-management" apply from: "${gradleScriptDir}/ide.gradle" @@ -206,7 +207,7 @@ configure(allprojects) { project -> ] as String[] } -configure(subprojects.findAll { (it.name != "spring-build-src") && (it.name != "spring-core-coroutines") } ) { subproject -> +configure(subprojects.findAll { (it.name != "spring-core-coroutines") } ) { subproject -> apply from: "${gradleScriptDir}/publish-maven.gradle" jar { diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000000..ede6eabd82 --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java-gradle-plugin' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'junit:junit:4.12' + testImplementation 'org.assertj:assertj-core:3.11.1' +} + +gradlePlugin { + plugins { + testSourcesPlugin { + id = "org.springframework.build.test-sources" + implementationClass = "org.springframework.build.testsources.TestSourcesPlugin" + } + } +} diff --git a/buildSrc/spring-build-src.gradle b/buildSrc/spring-build-src.gradle deleted file mode 100644 index 295cbf1d57..0000000000 --- a/buildSrc/spring-build-src.gradle +++ /dev/null @@ -1,10 +0,0 @@ -description = "Exposes gradle buildSrc for IDE support" - -apply plugin: "groovy" - -dependencies { - compile gradleApi() - compile localGroovy() -} - -configurations.archives.artifacts.clear() diff --git a/buildSrc/src/main/groovy/org/springframework/build/gradle/TestSourceSetDependenciesPlugin.groovy b/buildSrc/src/main/groovy/org/springframework/build/gradle/TestSourceSetDependenciesPlugin.groovy deleted file mode 100644 index c94e013a8a..0000000000 --- a/buildSrc/src/main/groovy/org/springframework/build/gradle/TestSourceSetDependenciesPlugin.groovy +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2002-2014 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. - */ - -package org.springframework.build.gradle - -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.ProjectDependency; - -/** - * Gradle plugin that automatically updates testCompile dependencies to include - * the test source sets of project dependencies. - * - * @author Phillip Webb - */ -class TestSourceSetDependenciesPlugin implements Plugin { - - @Override - public void apply(Project project) { - project.afterEvaluate { - Set projectDependencies = new LinkedHashSet() - collectProjectDependencies(projectDependencies, project) - projectDependencies.each { - project.dependencies.add("testCompile", it.dependencyProject.sourceSets.test.output) - } - } - } - - private void collectProjectDependencies(Set projectDependencies, Project project) { - for (def configurationName in ["compile", "optional", "provided", "testCompile"]) { - Configuration configuration = project.getConfigurations().findByName(configurationName) - if (configuration) { - configuration.dependencies.findAll { it instanceof ProjectDependency }.each { - projectDependencies.add(it) - collectProjectDependencies(projectDependencies, it.dependencyProject) - } - } - } - } - -} diff --git a/buildSrc/src/main/java/org/springframework/build/testsources/TestSourcesPlugin.java b/buildSrc/src/main/java/org/springframework/build/testsources/TestSourcesPlugin.java new file mode 100644 index 0000000000..5bdf4d0e63 --- /dev/null +++ b/buildSrc/src/main/java/org/springframework/build/testsources/TestSourcesPlugin.java @@ -0,0 +1,92 @@ +/* + * 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. + */ + +package org.springframework.build.testsources; + +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.ProjectDependency; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetOutput; + +/** + * {@link Plugin} that automatically updates testCompile dependencies to include + * the test source sets of {@code project()} dependencies. + * + *

This plugin is used in the Spring Framework build to share test utilities and fixtures + * between projects. + * + * @author Phillip Webb + * @author Brian Clozel + */ +public class TestSourcesPlugin implements Plugin { + + /** + * List of configurations this plugin should look for project dependencies in. + */ + private static final List CONFIGURATIONS = Arrays.asList( + JavaPlugin.COMPILE_CONFIGURATION_NAME, + JavaPlugin.API_CONFIGURATION_NAME, + JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, + "optional", + JavaPlugin.TEST_COMPILE_CONFIGURATION_NAME); + + @Override + public void apply(Project project) { + project.getPlugins().withType(JavaPlugin.class, (plugin) -> addTestSourcesToProject(project)); + } + + private void addTestSourcesToProject(Project project) { + project.afterEvaluate(currentProject -> { + Set projectDependencies = new LinkedHashSet<>(); + collectProjectDependencies(projectDependencies, project); + projectDependencies.forEach(dep -> addTestSourcesFromDependency(currentProject, dep)); + }); + } + + private void collectProjectDependencies(Set projectDependencies, Project project) { + for (String configurationName : CONFIGURATIONS) { + Configuration configuration = project.getConfigurations().findByName(configurationName); + if (configuration != null) { + configuration.getDependencies().forEach(dependency -> { + if (dependency instanceof ProjectDependency) { + ProjectDependency projectDependency = (ProjectDependency) dependency; + projectDependencies.add(projectDependency); + collectProjectDependencies(projectDependencies, projectDependency.getDependencyProject()); + } + }); + } + } + } + + private void addTestSourcesFromDependency(final Project currentProject, ProjectDependency dependency) { + Project dependencyProject = dependency.getDependencyProject(); + dependencyProject.getPlugins().withType(JavaPlugin.class, plugin -> { + final JavaPluginConvention javaPlugin = dependencyProject.getConvention() + .getPlugin(JavaPluginConvention.class); + SourceSetOutput test = javaPlugin.getSourceSets().findByName(SourceSet.TEST_SOURCE_SET_NAME).getOutput(); + currentProject.getDependencies().add(JavaPlugin.TEST_COMPILE_CONFIGURATION_NAME, test); + }); + } +} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/test-source-set-dependencies.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/test-source-set-dependencies.properties deleted file mode 100644 index f5df417ad2..0000000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/test-source-set-dependencies.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=org.springframework.build.gradle.TestSourceSetDependenciesPlugin diff --git a/settings.gradle b/settings.gradle index 907d85a759..60c6ceb4a3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,10 +22,6 @@ include "spring-webflux" include "spring-websocket" include "spring-framework-bom" -// Exposes gradle buildSrc for IDE support -include "buildSrc" -rootProject.children.find{ it.name == "buildSrc" }.name = "spring-build-src" - rootProject.name = "spring" rootProject.children.each {project -> project.buildFileName = "${project.name}.gradle"