From 1bf8756f204bdd4db6fe3553f0ae7bdc5de96710 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 7 Nov 2025 15:08:21 +0100 Subject: [PATCH] Add integration tests for `validateMultiReleaseJar` task This commit also renames the "validateJar" task to "validateMultiReleaseJar". Closes gh-35768 --- .../multirelease/MultiReleaseJarPlugin.java | 4 ++- .../MultiReleaseJarValidateTask.java | 3 +++ .../MultiReleaseJarPluginTests.java | 27 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) 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 bc4045c6e97..43ab9d1545a 100644 --- a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java +++ b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarPlugin.java @@ -41,6 +41,8 @@ import org.gradle.jvm.toolchain.JavaToolchainService; */ public class MultiReleaseJarPlugin implements Plugin { + public static String VALIDATE_JAR_TASK_NAME = "validateMultiReleaseJar"; + @Inject protected JavaToolchainService getToolchains() { throw new UnsupportedOperationException(); @@ -60,7 +62,7 @@ public class MultiReleaseJarPlugin implements Plugin { tasks, dependencies, objects); - TaskProvider validateJarTask = tasks.register("validateJar", MultiReleaseJarValidateTask.class, (task) -> { + TaskProvider validateJarTask = tasks.register(VALIDATE_JAR_TASK_NAME, MultiReleaseJarValidateTask.class, (task) -> { task.getJar().set(tasks.named("jar", Jar.class).flatMap(AbstractArchiveTask::getArchiveFile)); }); 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 75d237919e9..ba23ee26b02 100644 --- a/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarValidateTask.java +++ b/buildSrc/src/main/java/org/springframework/build/multirelease/MultiReleaseJarValidateTask.java @@ -27,11 +27,14 @@ import java.util.List; @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())); } + } 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 a678d4506d4..97e4bcb2dfd 100644 --- a/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java +++ b/buildSrc/src/test/java/org/springframework/build/multirelease/MultiReleaseJarPluginTests.java @@ -26,11 +26,13 @@ import java.util.jar.Attributes; import java.util.jar.JarFile; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; +import org.gradle.testkit.runner.UnexpectedBuildFailure; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * Tests for {@link MultiReleaseJarPlugin} @@ -116,6 +118,31 @@ public class MultiReleaseJarPluginTests { } } + @Test + void validateJar() throws IOException { + writeBuildFile(""" + plugins { + id 'java' + id 'org.springframework.build.multiReleaseJar' + } + version = '1.2.3' + multiRelease { releaseVersions 17 } + """); + writeClass("src/main/java17", "Main.java", """ + public class Main { + + public void method() {} + + } + """); + writeClass("src/main/java", "Main.java", """ + public class Main {} + """); + assertThatThrownBy(() ->runGradle("validateMultiReleaseJar")) + .isInstanceOf(UnexpectedBuildFailure.class) + .hasMessageContaining("entry: META-INF/versions/17/Main.class, has a class version incompatible with an earlier version"); + } + private void writeBuildFile(String buildContent) throws IOException { try (PrintWriter out = new PrintWriter(new FileWriter(this.buildFile))) { out.print(buildContent);