Reduce scope of mavenOptional feature to only the Maven Plugin
Previously, the mavenOptional was added to every published module but it was only used by spring-boot-maven-plugin. This commit reduces its scope so that it only affects the Maven plugin. It also reworks the implementation to reuse the existing optional configuration rather than declaring a new mavenOptional configuration. Lastly, publication of Gradle Module Metadata (GMM) has been disabled for spring-boot-maven-plugin. This is seen as preferable to publishing the metadata – which isn't really needed as it does not contain any useful additional information – and having to suppress warnings about incomplete mapping of GMM to pom metadata. Closes gh-41263
This commit is contained in:
parent
2ed72c6e4d
commit
365fdfee45
|
@ -19,8 +19,6 @@ package org.springframework.boot.build;
|
||||||
import org.apache.maven.artifact.repository.MavenArtifactRepository;
|
import org.apache.maven.artifact.repository.MavenArtifactRepository;
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
import org.gradle.api.attributes.Usage;
|
import org.gradle.api.attributes.Usage;
|
||||||
import org.gradle.api.component.AdhocComponentWithVariants;
|
|
||||||
import org.gradle.api.component.ConfigurationVariantDetails;
|
|
||||||
import org.gradle.api.plugins.JavaPlugin;
|
import org.gradle.api.plugins.JavaPlugin;
|
||||||
import org.gradle.api.plugins.JavaPluginExtension;
|
import org.gradle.api.plugins.JavaPluginExtension;
|
||||||
import org.gradle.api.publish.PublishingExtension;
|
import org.gradle.api.publish.PublishingExtension;
|
||||||
|
@ -101,7 +99,6 @@ class MavenPublishingConventions {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void customizeJavaMavenPublication(MavenPublication publication, Project project) {
|
private void customizeJavaMavenPublication(MavenPublication publication, Project project) {
|
||||||
addMavenOptionalFeature(publication, project);
|
|
||||||
if (publication.getName().equals("pluginMaven")) {
|
if (publication.getName().equals("pluginMaven")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -111,29 +108,6 @@ class MavenPublishingConventions {
|
||||||
(strategy) -> strategy.usage(Usage.JAVA_RUNTIME, VariantVersionMappingStrategy::fromResolutionResult));
|
(strategy) -> strategy.usage(Usage.JAVA_RUNTIME, VariantVersionMappingStrategy::fromResolutionResult));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a feature that allows maven plugins to declare optional dependencies that
|
|
||||||
* appear in the POM. This is required to make m2e in Eclipse happy.
|
|
||||||
* @param publication the project's Maven publication
|
|
||||||
* @param project the project to add the feature to
|
|
||||||
*/
|
|
||||||
private void addMavenOptionalFeature(MavenPublication publication, Project project) {
|
|
||||||
JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class);
|
|
||||||
extension.registerFeature("mavenOptional",
|
|
||||||
(feature) -> feature.usingSourceSet(extension.getSourceSets().getByName("main")));
|
|
||||||
AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants) project.getComponents()
|
|
||||||
.findByName("java");
|
|
||||||
javaComponent.addVariantsFromConfiguration(
|
|
||||||
project.getConfigurations().findByName("mavenOptionalRuntimeElements"),
|
|
||||||
ConfigurationVariantDetails::mapToOptional);
|
|
||||||
suppressMavenOptionalFeatureWarnings(publication);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void suppressMavenOptionalFeatureWarnings(MavenPublication publication) {
|
|
||||||
publication.suppressPomMetadataWarningsFor("mavenOptionalApiElements");
|
|
||||||
publication.suppressPomMetadataWarningsFor("mavenOptionalRuntimeElements");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void customizeOrganization(MavenPomOrganization organization) {
|
private void customizeOrganization(MavenPomOrganization organization) {
|
||||||
organization.getName().set("VMware, Inc.");
|
organization.getName().set("VMware, Inc.");
|
||||||
organization.getUrl().set("https://spring.io");
|
organization.getUrl().set("https://spring.io");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2023 the original author or authors.
|
* Copyright 2012-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -54,6 +54,8 @@ import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
|
||||||
import org.gradle.api.artifacts.result.ResolvedArtifactResult;
|
import org.gradle.api.artifacts.result.ResolvedArtifactResult;
|
||||||
import org.gradle.api.attributes.DocsType;
|
import org.gradle.api.attributes.DocsType;
|
||||||
import org.gradle.api.attributes.Usage;
|
import org.gradle.api.attributes.Usage;
|
||||||
|
import org.gradle.api.component.AdhocComponentWithVariants;
|
||||||
|
import org.gradle.api.component.SoftwareComponent;
|
||||||
import org.gradle.api.file.CopySpec;
|
import org.gradle.api.file.CopySpec;
|
||||||
import org.gradle.api.file.DirectoryProperty;
|
import org.gradle.api.file.DirectoryProperty;
|
||||||
import org.gradle.api.file.FileCollection;
|
import org.gradle.api.file.FileCollection;
|
||||||
|
@ -65,6 +67,7 @@ import org.gradle.api.plugins.JavaPluginExtension;
|
||||||
import org.gradle.api.publish.PublishingExtension;
|
import org.gradle.api.publish.PublishingExtension;
|
||||||
import org.gradle.api.publish.maven.MavenPublication;
|
import org.gradle.api.publish.maven.MavenPublication;
|
||||||
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin;
|
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin;
|
||||||
|
import org.gradle.api.publish.tasks.GenerateModuleMetadata;
|
||||||
import org.gradle.api.tasks.Classpath;
|
import org.gradle.api.tasks.Classpath;
|
||||||
import org.gradle.api.tasks.InputFiles;
|
import org.gradle.api.tasks.InputFiles;
|
||||||
import org.gradle.api.tasks.JavaExec;
|
import org.gradle.api.tasks.JavaExec;
|
||||||
|
@ -82,11 +85,14 @@ import org.gradle.api.tasks.bundling.Jar;
|
||||||
import org.gradle.api.tasks.javadoc.Javadoc;
|
import org.gradle.api.tasks.javadoc.Javadoc;
|
||||||
import org.gradle.external.javadoc.StandardJavadocDocletOptions;
|
import org.gradle.external.javadoc.StandardJavadocDocletOptions;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
import org.springframework.boot.build.DeployedPlugin;
|
import org.springframework.boot.build.DeployedPlugin;
|
||||||
import org.springframework.boot.build.MavenRepositoryPlugin;
|
import org.springframework.boot.build.MavenRepositoryPlugin;
|
||||||
|
import org.springframework.boot.build.optional.OptionalDependenciesPlugin;
|
||||||
import org.springframework.boot.build.test.DockerTestPlugin;
|
import org.springframework.boot.build.test.DockerTestPlugin;
|
||||||
import org.springframework.boot.build.test.IntegrationTestPlugin;
|
import org.springframework.boot.build.test.IntegrationTestPlugin;
|
||||||
import org.springframework.core.CollectionFactory;
|
import org.springframework.core.CollectionFactory;
|
||||||
|
@ -116,6 +122,33 @@ public class MavenPluginPlugin implements Plugin<Project> {
|
||||||
addDocumentPluginGoalsTask(project, generatePluginDescriptorTask);
|
addDocumentPluginGoalsTask(project, generatePluginDescriptorTask);
|
||||||
addPrepareMavenBinariesTask(project);
|
addPrepareMavenBinariesTask(project);
|
||||||
addExtractVersionPropertiesTask(project);
|
addExtractVersionPropertiesTask(project);
|
||||||
|
publishOptionalDependenciesInPom(project);
|
||||||
|
project.getTasks().withType(GenerateModuleMetadata.class).configureEach((task) -> task.setEnabled(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void publishOptionalDependenciesInPom(Project project) {
|
||||||
|
project.getPlugins().withType(OptionalDependenciesPlugin.class, (optionalDependencies) -> {
|
||||||
|
SoftwareComponent component = project.getComponents().findByName("java");
|
||||||
|
if (component instanceof AdhocComponentWithVariants componentWithVariants) {
|
||||||
|
componentWithVariants.addVariantsFromConfiguration(
|
||||||
|
project.getConfigurations().getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME),
|
||||||
|
(variant) -> variant.mapToOptional());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
MavenPublication publication = (MavenPublication) project.getExtensions()
|
||||||
|
.getByType(PublishingExtension.class)
|
||||||
|
.getPublications()
|
||||||
|
.getByName("maven");
|
||||||
|
publication.getPom().withXml((xml) -> {
|
||||||
|
Element root = xml.asElement();
|
||||||
|
NodeList children = root.getChildNodes();
|
||||||
|
for (int i = 0; i < children.getLength(); i++) {
|
||||||
|
Node child = children.item(i);
|
||||||
|
if ("dependencyManagement".equals(child.getNodeName())) {
|
||||||
|
root.removeChild(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configurePomPackaging(Project project) {
|
private void configurePomPackaging(Project project) {
|
||||||
|
|
|
@ -58,17 +58,17 @@ dependencies {
|
||||||
intTestImplementation("org.assertj:assertj-core")
|
intTestImplementation("org.assertj:assertj-core")
|
||||||
intTestImplementation("org.junit.jupiter:junit-jupiter")
|
intTestImplementation("org.junit.jupiter:junit-jupiter")
|
||||||
|
|
||||||
mavenOptionalImplementation("org.apache.maven.plugins:maven-shade-plugin") {
|
|
||||||
exclude(group: "javax.annotation", module: "javax.annotation-api")
|
|
||||||
exclude(group: "javax.enterprise", module: "cdi-api")
|
|
||||||
exclude(group: "javax.inject", module: "javax.inject")
|
|
||||||
}
|
|
||||||
|
|
||||||
mavenRepository(project(path: ":spring-boot-project:spring-boot", configuration: "mavenRepository"))
|
mavenRepository(project(path: ":spring-boot-project:spring-boot", configuration: "mavenRepository"))
|
||||||
mavenRepository(project(path: ":spring-boot-project:spring-boot-test", configuration: "mavenRepository"))
|
mavenRepository(project(path: ":spring-boot-project:spring-boot-test", configuration: "mavenRepository"))
|
||||||
mavenRepository(project(path: ":spring-boot-project:spring-boot-devtools", configuration: "mavenRepository"))
|
mavenRepository(project(path: ":spring-boot-project:spring-boot-devtools", configuration: "mavenRepository"))
|
||||||
mavenRepository(project(path: ":spring-boot-project:spring-boot-docker-compose", configuration: "mavenRepository"))
|
mavenRepository(project(path: ":spring-boot-project:spring-boot-docker-compose", configuration: "mavenRepository"))
|
||||||
|
|
||||||
|
optional("org.apache.maven.plugins:maven-shade-plugin") {
|
||||||
|
exclude(group: "javax.annotation", module: "javax.annotation-api")
|
||||||
|
exclude(group: "javax.enterprise", module: "cdi-api")
|
||||||
|
exclude(group: "javax.inject", module: "javax.inject")
|
||||||
|
}
|
||||||
|
|
||||||
testImplementation("org.apache.maven:maven-core") {
|
testImplementation("org.apache.maven:maven-core") {
|
||||||
exclude(group: "javax.annotation", module: "javax.annotation-api")
|
exclude(group: "javax.annotation", module: "javax.annotation-api")
|
||||||
exclude(group: "javax.inject", module: "javax.inject")
|
exclude(group: "javax.inject", module: "javax.inject")
|
||||||
|
|
Loading…
Reference in New Issue