Browse Source

Move TestSourcesPlugin to a Java Gradle plugin

This commit moves the existing "test sources" Gradle plugin from Groovy
to Java and updates the "buildSrc" build file to prepare for additional
plugins in the Spring Framework build.

The plugin itself looks, for a given Spring Framework module, at all the
project dependencies for the following scopes: "compile", "testCompile",
"api", "implementation" and "optional" (to be supported by a different
plugin).

See gh-23282
pull/23470/head
Brian Clozel 5 years ago
parent
commit
4e5c780b99
  1. 7
      build.gradle
  2. 21
      buildSrc/build.gradle
  3. 10
      buildSrc/spring-build-src.gradle
  4. 55
      buildSrc/src/main/groovy/org/springframework/build/gradle/TestSourceSetDependenciesPlugin.groovy
  5. 92
      buildSrc/src/main/java/org/springframework/build/testsources/TestSourcesPlugin.java
  6. 1
      buildSrc/src/main/resources/META-INF/gradle-plugins/test-source-set-dependencies.properties
  7. 4
      settings.gradle

7
build.gradle

@ -12,6 +12,7 @@ buildscript { @@ -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 { @@ -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 -> @@ -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 -> @@ -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 {

21
buildSrc/build.gradle

@ -0,0 +1,21 @@ @@ -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"
}
}
}

10
buildSrc/spring-build-src.gradle

@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
description = "Exposes gradle buildSrc for IDE support"
apply plugin: "groovy"
dependencies {
compile gradleApi()
compile localGroovy()
}
configurations.archives.artifacts.clear()

55
buildSrc/src/main/groovy/org/springframework/build/gradle/TestSourceSetDependenciesPlugin.groovy

@ -1,55 +0,0 @@ @@ -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<Project> {
@Override
public void apply(Project project) {
project.afterEvaluate {
Set<ProjectDependency> projectDependencies = new LinkedHashSet<ProjectDependency>()
collectProjectDependencies(projectDependencies, project)
projectDependencies.each {
project.dependencies.add("testCompile", it.dependencyProject.sourceSets.test.output)
}
}
}
private void collectProjectDependencies(Set<ProjectDependency> 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)
}
}
}
}
}

92
buildSrc/src/main/java/org/springframework/build/testsources/TestSourcesPlugin.java

@ -0,0 +1,92 @@ @@ -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.
*
* <p>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<Project> {
/**
* List of configurations this plugin should look for project dependencies in.
*/
private static final List<String> 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<ProjectDependency> projectDependencies = new LinkedHashSet<>();
collectProjectDependencies(projectDependencies, project);
projectDependencies.forEach(dep -> addTestSourcesFromDependency(currentProject, dep));
});
}
private void collectProjectDependencies(Set<ProjectDependency> 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);
});
}
}

1
buildSrc/src/main/resources/META-INF/gradle-plugins/test-source-set-dependencies.properties

@ -1 +0,0 @@ @@ -1 +0,0 @@
implementation-class=org.springframework.build.gradle.TestSourceSetDependenciesPlugin

4
settings.gradle

@ -22,10 +22,6 @@ include "spring-webflux" @@ -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"

Loading…
Cancel
Save