Merge branch '2.3.x'
Closes gh-21940
This commit is contained in:
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020-2020 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.boot.build;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import org.gradle.api.Plugin;
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.artifacts.Configuration;
|
||||
import org.gradle.api.artifacts.ConfigurationContainer;
|
||||
import org.gradle.api.artifacts.Dependency;
|
||||
import org.gradle.api.plugins.JavaBasePlugin;
|
||||
|
||||
import org.springframework.boot.build.optional.OptionalDependenciesPlugin;
|
||||
|
||||
/**
|
||||
* Plugin to apply internal dependency management to Spring Boot's projects. Uses a custom
|
||||
* configuration to enforce a platform for Spring Boot's own build. This prevents the
|
||||
* enforced (strict) constraints from being visible to external consumers.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class InternalDependencyManagementPlugin implements Plugin<Project> {
|
||||
|
||||
@Override
|
||||
public void apply(Project project) {
|
||||
project.getPlugins().withType(JavaBasePlugin.class, (java) -> configureDependencyManagement(project));
|
||||
}
|
||||
|
||||
private void configureDependencyManagement(Project project) {
|
||||
ConfigurationContainer configurations = project.getConfigurations();
|
||||
Configuration dependencyManagement = configurations.create("internalDependencyManagement", (configuration) -> {
|
||||
configuration.setVisible(false);
|
||||
configuration.setCanBeConsumed(false);
|
||||
configuration.setCanBeResolved(false);
|
||||
});
|
||||
configurations.matching((configuration) -> configuration.getName().endsWith("Classpath"))
|
||||
.all((configuration) -> configuration.extendsFrom(dependencyManagement));
|
||||
Dependency springBootParent = project.getDependencies().enforcedPlatform(project.getDependencies()
|
||||
.project(Collections.singletonMap("path", ":spring-boot-project:spring-boot-parent")));
|
||||
dependencyManagement.getDependencies().add(springBootParent);
|
||||
project.getPlugins().withType(OptionalDependenciesPlugin.class, (optionalDependencies) -> configurations
|
||||
.getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME).extendsFrom(dependencyManagement));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,6 +17,7 @@ package org.springframework.boot.build;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
@@ -25,8 +26,12 @@ import java.util.function.Consumer;
|
||||
import io.spring.javaformat.gradle.FormatTask;
|
||||
import io.spring.javaformat.gradle.SpringJavaFormatPlugin;
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.artifacts.Configuration;
|
||||
import org.gradle.api.artifacts.ConfigurationContainer;
|
||||
import org.gradle.api.artifacts.Dependency;
|
||||
import org.gradle.api.artifacts.DependencySet;
|
||||
import org.gradle.api.plugins.JavaBasePlugin;
|
||||
import org.gradle.api.plugins.JavaPlugin;
|
||||
import org.gradle.api.plugins.quality.CheckstyleExtension;
|
||||
import org.gradle.api.plugins.quality.CheckstylePlugin;
|
||||
import org.gradle.api.tasks.bundling.Jar;
|
||||
@@ -36,6 +41,7 @@ import org.gradle.api.tasks.testing.Test;
|
||||
import org.gradle.testretry.TestRetryPlugin;
|
||||
import org.gradle.testretry.TestRetryTaskExtension;
|
||||
|
||||
import org.springframework.boot.build.optional.OptionalDependenciesPlugin;
|
||||
import org.springframework.boot.build.testing.TestFailuresPlugin;
|
||||
|
||||
/**
|
||||
@@ -60,6 +66,7 @@ import org.springframework.boot.build.testing.TestFailuresPlugin;
|
||||
* <li>{@code Implementation-Title}
|
||||
* <li>{@code Implementation-Version}
|
||||
* </ul>
|
||||
* <li>{@code spring-boot-parent} is used for dependency management</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p/>
|
||||
@@ -80,6 +87,7 @@ class JavaConventions {
|
||||
configureJavadocConventions(project);
|
||||
configureTestConventions(project);
|
||||
configureJarManifestConventions(project);
|
||||
configureDependencyManagement(project);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -164,4 +172,22 @@ class JavaConventions {
|
||||
.add(project.getDependencies().create("io.spring.javaformat:spring-javaformat-checkstyle:" + version));
|
||||
}
|
||||
|
||||
private void configureDependencyManagement(Project project) {
|
||||
ConfigurationContainer configurations = project.getConfigurations();
|
||||
Configuration dependencyManagement = configurations.create("dependencyManagement", (configuration) -> {
|
||||
configuration.setVisible(false);
|
||||
configuration.setCanBeConsumed(false);
|
||||
configuration.setCanBeResolved(false);
|
||||
});
|
||||
configurations
|
||||
.matching((configuration) -> configuration.getName().endsWith("Classpath")
|
||||
|| JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME.equals(configuration.getName()))
|
||||
.all((configuration) -> configuration.extendsFrom(dependencyManagement));
|
||||
Dependency springBootParent = project.getDependencies().enforcedPlatform(project.getDependencies()
|
||||
.project(Collections.singletonMap("path", ":spring-boot-project:spring-boot-parent")));
|
||||
dependencyManagement.getDependencies().add(springBootParent);
|
||||
project.getPlugins().withType(OptionalDependenciesPlugin.class, (optionalDependencies) -> configurations
|
||||
.getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME).extendsFrom(dependencyManagement));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.boot.build;
|
||||
|
||||
import org.apache.maven.artifact.repository.MavenArtifactRepository;
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.attributes.Usage;
|
||||
import org.gradle.api.plugins.JavaPlugin;
|
||||
import org.gradle.api.plugins.JavaPluginExtension;
|
||||
import org.gradle.api.publish.PublishingExtension;
|
||||
@@ -40,8 +41,12 @@ import org.gradle.api.publish.maven.plugins.MavenPublishPlugin;
|
||||
* it.
|
||||
* <li>The poms of all {@link MavenPublication Maven publications} are customized to meet
|
||||
* Maven Central's requirements.
|
||||
* <li>If the {@link JavaPlugin Java plugin} has also been applied, creation of Javadoc
|
||||
* and source jars is enabled.
|
||||
* <li>If the {@link JavaPlugin Java plugin} has also been applied:
|
||||
* <ul>
|
||||
* <li>Creation of Javadoc and source jars is enabled.
|
||||
* <li>Publication metadata (poms and Gradle module metadata) is configured to use
|
||||
* resolved versions.
|
||||
* </ul>
|
||||
* </ul>
|
||||
*
|
||||
* <p/>
|
||||
@@ -62,7 +67,7 @@ class MavenPublishingConventions {
|
||||
});
|
||||
}
|
||||
publishing.getPublications().withType(MavenPublication.class)
|
||||
.all((mavenPublication) -> customizePom(mavenPublication.getPom(), project));
|
||||
.all((mavenPublication) -> customizeMavenPublication(mavenPublication, project));
|
||||
project.getPlugins().withType(JavaPlugin.class).all((javaPlugin) -> {
|
||||
JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class);
|
||||
extension.withJavadocJar();
|
||||
@@ -71,6 +76,12 @@ class MavenPublishingConventions {
|
||||
});
|
||||
}
|
||||
|
||||
private void customizeMavenPublication(MavenPublication publication, Project project) {
|
||||
customizePom(publication.getPom(), project);
|
||||
project.getPlugins().withType(JavaPlugin.class)
|
||||
.all((javaPlugin) -> customizeJavaMavenPublication(publication, project));
|
||||
}
|
||||
|
||||
private void customizePom(MavenPom pom, Project project) {
|
||||
pom.getUrl().set("https://spring.io/projects/spring-boot");
|
||||
pom.getName().set(project.provider(project::getName));
|
||||
@@ -82,6 +93,13 @@ class MavenPublishingConventions {
|
||||
pom.issueManagement(this::customizeIssueManagement);
|
||||
}
|
||||
|
||||
private void customizeJavaMavenPublication(MavenPublication publication, Project project) {
|
||||
publication.versionMapping((strategy) -> strategy.usage(Usage.JAVA_API, (mappingStrategy) -> mappingStrategy
|
||||
.fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)));
|
||||
publication.versionMapping((strategy) -> strategy.usage(Usage.JAVA_RUNTIME,
|
||||
(mappingStrategy) -> mappingStrategy.fromResolutionResult()));
|
||||
}
|
||||
|
||||
private void customizeOrganization(MavenPomOrganization organization) {
|
||||
organization.getName().set("Pivotal Software, Inc.");
|
||||
organization.getUrl().set("https://spring.io");
|
||||
|
||||
@@ -29,7 +29,6 @@ import org.gradle.api.plugins.PluginContainer;
|
||||
|
||||
import org.springframework.boot.build.ConventionsPlugin;
|
||||
import org.springframework.boot.build.DeployedPlugin;
|
||||
import org.springframework.boot.build.InternalDependencyManagementPlugin;
|
||||
import org.springframework.boot.build.classpath.CheckClasspathForConflicts;
|
||||
import org.springframework.boot.build.classpath.CheckClasspathForProhibitedDependencies;
|
||||
import org.springframework.util.StringUtils;
|
||||
@@ -47,7 +46,6 @@ public class StarterPlugin implements Plugin<Project> {
|
||||
plugins.apply(DeployedPlugin.class);
|
||||
plugins.apply(JavaLibraryPlugin.class);
|
||||
plugins.apply(ConventionsPlugin.class);
|
||||
plugins.apply(InternalDependencyManagementPlugin.class);
|
||||
StarterMetadata starterMetadata = project.getTasks().create("starterMetadata", StarterMetadata.class);
|
||||
ConfigurationContainer configurations = project.getConfigurations();
|
||||
Configuration runtimeClasspath = configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);
|
||||
|
||||
@@ -51,6 +51,17 @@ class ConventionsPluginTests {
|
||||
void setup(@TempDir File projectDir) throws IOException {
|
||||
this.projectDir = projectDir;
|
||||
this.buildFile = new File(this.projectDir, "build.gradle");
|
||||
File settingsFile = new File(this.projectDir, "settings.gradle");
|
||||
try (PrintWriter out = new PrintWriter(new FileWriter(settingsFile))) {
|
||||
out.println("include ':spring-boot-project:spring-boot-parent'");
|
||||
}
|
||||
File springBootParent = new File(this.projectDir, "spring-boot-project/spring-boot-parent/build.gradle");
|
||||
springBootParent.getParentFile().mkdirs();
|
||||
try (PrintWriter out = new PrintWriter(new FileWriter(springBootParent))) {
|
||||
out.println("plugins {");
|
||||
out.println(" id 'java-platform'");
|
||||
out.println("}");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user