From 771517dc36735842a129ea3a51738f0b6fcce7bd Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 10 Nov 2025 09:57:06 +0100 Subject: [PATCH] Ensure that jar verification runs on JDK 25 This commit ensures that the JAR verification task runs on JDK 25 as this feature has been introduced in https://bugs.openjdk.org/browse/JDK-8355940 Fixes gh-35777 See gh-35773 --- .../build/multirelease/MultiReleaseJarPlugin.java | 3 +++ .../multirelease/MultiReleaseJarValidateTask.java | 13 ++++++++++--- .../multirelease/MultiReleaseJarPluginTests.java | 5 ++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java index 43ab9d1545a..a2aa7fba46c 100644 --- a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java @@ -30,6 +30,7 @@ import org.gradle.api.tasks.TaskContainer; import org.gradle.api.tasks.TaskProvider; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.jvm.tasks.Jar; +import org.gradle.jvm.toolchain.JavaLanguageVersion; import org.gradle.jvm.toolchain.JavaToolchainService; /** @@ -62,8 +63,10 @@ public class MultiReleaseJarPlugin implements Plugin { tasks, dependencies, objects); + TaskProvider validateJarTask = tasks.register(VALIDATE_JAR_TASK_NAME, MultiReleaseJarValidateTask.class, (task) -> { task.getJar().set(tasks.named("jar", Jar.class).flatMap(AbstractArchiveTask::getArchiveFile)); + task.getJavaLauncher().set(task.getJavaToolchainService().launcherFor(spec -> spec.getLanguageVersion().set(JavaLanguageVersion.of(25)))); }); tasks.named("check", task -> task.dependsOn(validateJarTask)); } diff --git a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarValidateTask.java b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarValidateTask.java index ba23ee26b02..fd1e4960649 100644 --- a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarValidateTask.java +++ b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarValidateTask.java @@ -22,19 +22,26 @@ import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.JavaExec; import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; +import org.gradle.jvm.toolchain.JavaToolchainService; import java.util.List; +import javax.inject.Inject; + @CacheableTask public abstract class MultiReleaseJarValidateTask extends JavaExec { - @InputFile - @PathSensitive(PathSensitivity.RELATIVE) - public abstract RegularFileProperty getJar(); public MultiReleaseJarValidateTask() { getMainModule().set("jdk.jartool"); getArgumentProviders().add(() -> List.of("--validate", "--file", getJar().get().getAsFile().getAbsolutePath())); } + @Inject + protected abstract JavaToolchainService getJavaToolchainService(); + + @InputFile + @PathSensitive(PathSensitivity.RELATIVE) + public abstract RegularFileProperty getJar(); + } diff --git a/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java b/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java index 97e4bcb2dfd..58d47e82e12 100644 --- a/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java +++ b/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java @@ -126,6 +126,9 @@ public class MultiReleaseJarPluginTests { id 'org.springframework.build.multiReleaseJar' } version = '1.2.3' + tasks.withType(JavaCompile).configureEach { + options.release = 11 + } multiRelease { releaseVersions 17 } """); writeClass("src/main/java17", "Main.java", """ @@ -140,7 +143,7 @@ public class MultiReleaseJarPluginTests { """); assertThatThrownBy(() ->runGradle("validateMultiReleaseJar")) .isInstanceOf(UnexpectedBuildFailure.class) - .hasMessageContaining("entry: META-INF/versions/17/Main.class, has a class version incompatible with an earlier version"); + .hasMessageContaining("entry: META-INF/versions/17/Main.class, contains a class with different api from earlier version"); } private void writeBuildFile(String buildContent) throws IOException {