Skip to content

Commit c7ec608

Browse files
committed
Publish a runtime variant that supports Java 22
In order to support Java 22, we must use spring-core 6.1.x. spring-core 6.1.x is a multi-release jar so, in order to support Java 22, a version of Gradle that supports multi-release jars must be used. This commit adds a new variant to spring-boot-gradle-plugin for modern versions of Gradle. When Gradle's plugin API version is 8.7 or later, we use spring-core 6.1.x. spring-core 6.0.x is used at all other times. Closes gh-40074
1 parent 6fd3ebb commit c7ec608

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

buildSrc/src/main/java/org/springframework/boot/build/MavenPublishingConventions.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ private void customizeMavenPublication(MavenPublication publication, Project pro
8383
project.getPlugins()
8484
.withType(JavaPlugin.class)
8585
.all((javaPlugin) -> customizeJavaMavenPublication(publication, project));
86-
suppressMavenOptionalFeatureWarnings(publication);
8786
}
8887

8988
private void customizePom(MavenPom pom, Project project) {
@@ -102,7 +101,10 @@ private void customizePom(MavenPom pom, Project project) {
102101
}
103102

104103
private void customizeJavaMavenPublication(MavenPublication publication, Project project) {
105-
addMavenOptionalFeature(project);
104+
addMavenOptionalFeature(publication, project);
105+
if (publication.getName().equals("pluginMaven")) {
106+
return;
107+
}
106108
publication.versionMapping((strategy) -> strategy.usage(Usage.JAVA_API, (mappingStrategy) -> mappingStrategy
107109
.fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)));
108110
publication.versionMapping(
@@ -112,9 +114,10 @@ private void customizeJavaMavenPublication(MavenPublication publication, Project
112114
/**
113115
* Add a feature that allows maven plugins to declare optional dependencies that
114116
* appear in the POM. This is required to make m2e in Eclipse happy.
117+
* @param publication the project's Maven publication
115118
* @param project the project to add the feature to
116119
*/
117-
private void addMavenOptionalFeature(Project project) {
120+
private void addMavenOptionalFeature(MavenPublication publication, Project project) {
118121
JavaPluginExtension extension = project.getExtensions().getByType(JavaPluginExtension.class);
119122
extension.registerFeature("mavenOptional",
120123
(feature) -> feature.usingSourceSet(extension.getSourceSets().getByName("main")));
@@ -123,6 +126,7 @@ private void addMavenOptionalFeature(Project project) {
123126
javaComponent.addVariantsFromConfiguration(
124127
project.getConfigurations().findByName("mavenOptionalRuntimeElements"),
125128
ConfigurationVariantDetails::mapToOptional);
129+
suppressMavenOptionalFeatureWarnings(publication);
126130
}
127131

128132
private void suppressMavenOptionalFeatureWarnings(MavenPublication publication) {

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/build.gradle

+47-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,34 @@ configurations {
1515
// Downgrade SLF4J is required for tests to run in Eclipse
1616
resolutionStrategy.force("org.slf4j:slf4j-api:1.7.36")
1717
}
18-
all {
18+
modernGradleRuntimeClasspath {
19+
extendsFrom runtimeClasspath
20+
canBeConsumed = false
21+
canBeResolved = true
22+
}
23+
modernGradleRuntimeElements {
24+
extendsFrom configurations.implementation, configurations.runtimeOnly
25+
canBeConsumed = true
26+
canBeResolved = false
27+
attributes {
28+
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category, Category.LIBRARY))
29+
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling, Bundling.EXTERNAL))
30+
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17)
31+
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements, LibraryElements.JAR))
32+
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage, Usage.JAVA_RUNTIME))
33+
attribute(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, project.objects.named(GradlePluginApiVersion, "8.7"))
34+
}
35+
outgoing.artifacts.addAll(configurations.runtimeElements.outgoing.artifacts)
36+
}
37+
runtimeElements {
38+
attributes {
39+
attribute(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, project.objects.named(GradlePluginApiVersion, "7.5"))
40+
}
41+
}
42+
all { configuration ->
43+
if (configuration.name == 'modernGradleRuntimeClasspath') {
44+
return
45+
}
1946
resolutionStrategy {
2047
eachDependency { dependency ->
2148
// Downgrade Jackson as Gradle cannot cope with 2.15.0's multi-version
@@ -44,6 +71,10 @@ configurations {
4471
}
4572
}
4673

74+
components.java.addVariantsFromConfiguration(configurations.modernGradleRuntimeElements) {
75+
mapToMavenScope("runtime")
76+
}
77+
4778
dependencies {
4879
asciidoctorExtensions("io.spring.asciidoctor:spring-asciidoctor-extensions-section-ids")
4980

@@ -166,3 +197,18 @@ artifacts {
166197
toolchain {
167198
maximumCompatibleJavaVersion = JavaLanguageVersion.of(20)
168199
}
200+
201+
publishing {
202+
publications.matching { it.name == 'pluginMaven' }.configureEach {
203+
versionMapping {
204+
allVariants {
205+
fromResolutionOf(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)
206+
}
207+
}
208+
versionMapping {
209+
variant(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, project.objects.named(GradlePluginApiVersion, "8.7")) {
210+
fromResolutionOf("modernGradleRuntimeClasspath")
211+
}
212+
}
213+
}
214+
}

0 commit comments

Comments
 (0)