From 365fdfee45547cf0a9fcf521e30cc3cf593f3c20 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 28 Jun 2024 09:20:29 +0100 Subject: [PATCH] Reduce scope of mavenOptional feature to only the Maven Plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../build/MavenPublishingConventions.java | 26 -------------- .../build/mavenplugin/MavenPluginPlugin.java | 35 ++++++++++++++++++- .../spring-boot-maven-plugin/build.gradle | 12 +++---- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/MavenPublishingConventions.java b/buildSrc/src/main/java/org/springframework/boot/build/MavenPublishingConventions.java index aae8016d431..25960781560 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/MavenPublishingConventions.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/MavenPublishingConventions.java @@ -19,8 +19,6 @@ 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.component.AdhocComponentWithVariants; -import org.gradle.api.component.ConfigurationVariantDetails; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.publish.PublishingExtension; @@ -101,7 +99,6 @@ class MavenPublishingConventions { } private void customizeJavaMavenPublication(MavenPublication publication, Project project) { - addMavenOptionalFeature(publication, project); if (publication.getName().equals("pluginMaven")) { return; } @@ -111,29 +108,6 @@ class MavenPublishingConventions { (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) { organization.getName().set("VMware, Inc."); organization.getUrl().set("https://spring.io"); diff --git a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java index 15e4450c012..22b0c865c40 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/mavenplugin/MavenPluginPlugin.java @@ -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"); * 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.attributes.DocsType; 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.DirectoryProperty; 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.maven.MavenPublication; 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.InputFiles; 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.external.javadoc.StandardJavadocDocletOptions; import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.springframework.boot.build.DeployedPlugin; 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.IntegrationTestPlugin; import org.springframework.core.CollectionFactory; @@ -116,6 +122,33 @@ public class MavenPluginPlugin implements Plugin { addDocumentPluginGoalsTask(project, generatePluginDescriptorTask); addPrepareMavenBinariesTask(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) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle index b554caf6445..66c971b6f99 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/build.gradle @@ -58,17 +58,17 @@ dependencies { intTestImplementation("org.assertj:assertj-core") 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-test", 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")) + 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") { exclude(group: "javax.annotation", module: "javax.annotation-api") exclude(group: "javax.inject", module: "javax.inject")