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 fc1f5cb357d..9e9b38520c7 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/MavenPublishingConventions.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/MavenPublishingConventions.java @@ -83,7 +83,6 @@ class MavenPublishingConventions { project.getPlugins() .withType(JavaPlugin.class) .all((javaPlugin) -> customizeJavaMavenPublication(publication, project)); - suppressMavenOptionalFeatureWarnings(publication); } private void customizePom(MavenPom pom, Project project) { @@ -102,7 +101,10 @@ class MavenPublishingConventions { } private void customizeJavaMavenPublication(MavenPublication publication, Project project) { - addMavenOptionalFeature(project); + addMavenOptionalFeature(publication, project); + if (publication.getName().equals("pluginMaven")) { + return; + } publication.versionMapping((strategy) -> strategy.usage(Usage.JAVA_API, (mappingStrategy) -> mappingStrategy .fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME))); publication.versionMapping( @@ -112,9 +114,10 @@ class MavenPublishingConventions { /** * 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(Project project) { + private void addMavenOptionalFeature(MavenPublication publication, Project project) { JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class); extension.registerFeature("mavenOptional", (feature) -> feature.usingSourceSet(extension.getSourceSets().getByName("main"))); @@ -123,6 +126,7 @@ class MavenPublishingConventions { javaComponent.addVariantsFromConfiguration( project.getConfigurations().findByName("mavenOptionalRuntimeElements"), ConfigurationVariantDetails::mapToOptional); + suppressMavenOptionalFeatureWarnings(publication); } private void suppressMavenOptionalFeatureWarnings(MavenPublication publication) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle index 36a2c3b8f6e..f1886f61f96 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle @@ -15,7 +15,34 @@ configurations { // Downgrade SLF4J is required for tests to run in Eclipse resolutionStrategy.force("org.slf4j:slf4j-api:1.7.36") } - all { + modernGradleRuntimeClasspath { + extendsFrom runtimeClasspath + canBeConsumed = false + canBeResolved = true + } + modernGradleRuntimeElements { + extendsFrom configurations.implementation, configurations.runtimeOnly + canBeConsumed = true + canBeResolved = false + attributes { + attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category, Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling, Bundling.EXTERNAL)) + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements, LibraryElements.JAR)) + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage, Usage.JAVA_RUNTIME)) + attribute(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, project.objects.named(GradlePluginApiVersion, "8.7")) + } + outgoing.artifacts.addAll(configurations.runtimeElements.outgoing.artifacts) + } + runtimeElements { + attributes { + attribute(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, project.objects.named(GradlePluginApiVersion, "7.5")) + } + } + all { configuration -> + if (configuration.name == 'modernGradleRuntimeClasspath') { + return + } resolutionStrategy { eachDependency { dependency -> // Downgrade Jackson as Gradle cannot cope with 2.15.0's multi-version @@ -44,6 +71,10 @@ configurations { } } +components.java.addVariantsFromConfiguration(configurations.modernGradleRuntimeElements) { + mapToMavenScope("runtime") +} + dependencies { asciidoctorExtensions("io.spring.asciidoctor:spring-asciidoctor-extensions-section-ids") @@ -166,3 +197,18 @@ artifacts { toolchain { maximumCompatibleJavaVersion = JavaLanguageVersion.of(20) } + +publishing { + publications.matching { it.name == 'pluginMaven' }.configureEach { + versionMapping { + allVariants { + fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME) + } + } + versionMapping { + variant(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, project.objects.named(GradlePluginApiVersion, "8.7")) { + fromResolutionOf("modernGradleRuntimeClasspath") + } + } + } +}