Require dependency on s-b-dependencies to use its constraints
Previously, Spring Boot's modules published Gradle Module Metadata (GMM) the declared a platform dependency on spring-boot-dependencies. This provided versions for each module's own dependencies but also had they unwanted side-effect of pulling in spring-boot-dependencies constraints which would influence the version of other dependencies declared in the same configuration. This was undesirable as users should be able to opt in to this level of dependency management, either by using the dependency management plugin or by using Gradle's built-in support via a platform dependency on spring-boot-dependencies. This commit reworks how Spring Boot's build uses spring-boot-dependencies and spring-boot-parent to provide its own dependency management. Configurations that aren't seen by consumers are configured to extend a dependencyManagement configuration that has an enforced platform dependency on spring-boot-parent. This enforces spring-boot-parent's version constraints on Spring Boot's build without making them visible to consumers. To ensure that the versions that Spring Boot has been built against are visible to consumers, the Maven publication that produces pom files and GMM for the published modules is configured to use the resolved versions from the module's runtime classpath. Fixes gh-21911pull/22035/head
parent
e30b8bf742
commit
0de466e06e
@ -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));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue