From 2f2beabf855f401b9c4fa3f67b68f9997499e989 Mon Sep 17 00:00:00 2001 From: Ron Webb Date: Sun, 5 Oct 2025 02:43:10 +1300 Subject: [PATCH 1/7] Upgrade to version 2.0.0, enhance compatibility with Gradle 8.11+ to 9.0+, and update Java source compatibility to 17. Refactor test dependencies and improve task handling in the module plugin. --- README.md | 42 +++++++------ build.gradle | 19 +++--- gradle/wrapper/gradle-wrapper.properties | 2 +- .../moduleplugin/TestEngine.java | 14 ++++- .../internal/CompileModuleInfoHelper.java | 11 +++- .../tasks/AbstractExecutionMutator.java | 2 +- .../tasks/CompileModuleInfoTask.java | 2 +- .../tasks/ModularCreateStartScripts.java | 16 ++--- .../moduleplugin/tasks/ModularJavaExec.java | 14 +---- .../tasks/StartScriptsMutator.java | 7 +-- .../moduleplugin/ModulePluginSmokeTest.java | 63 ++++++++++--------- test-project-groovy/build.gradle | 5 +- test-project-groovy/settings.gradle | 10 +++ .../smoke_test_settings.gradle | 11 ---- test-project-kotlin-pre-1-7/build.gradle.kts | 2 +- test-project-kotlin-pre-1-7/settings.gradle | 10 +++ .../smoke_test_settings.gradle | 11 ---- test-project-kotlin/build.gradle.kts | 2 +- test-project-kotlin/settings.gradle | 10 +++ .../smoke_test_settings.gradle | 11 ---- test-project-mixed/build.gradle | 4 +- test-project-mixed/settings.gradle | 10 +++ test-project-mixed/smoke_test_settings.gradle | 11 ---- test-project/build.gradle | 4 +- test-project/settings.gradle | 10 +++ test-project/smoke_test_settings.gradle | 11 ---- 26 files changed, 163 insertions(+), 151 deletions(-) delete mode 100644 test-project-groovy/smoke_test_settings.gradle delete mode 100644 test-project-kotlin-pre-1-7/smoke_test_settings.gradle delete mode 100644 test-project-kotlin/smoke_test_settings.gradle delete mode 100644 test-project-mixed/smoke_test_settings.gradle delete mode 100644 test-project/smoke_test_settings.gradle diff --git a/README.md b/README.md index 7ae794d..3c40063 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,16 @@ The plugin supports the following test engines: An example application using this plugin is available [here](https://github.com/java9-modularity/gradle-modules-plugin-example). -Compatability +Compatibility === -| Plugin Version | Gradle Versions | Java Version | Kotlin Version | Notes | -|------------------|-----------------|--------------|----------------|--------------------------------------------------------------------------------------------| -| - -> 1.8.12 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.6.+ | | -| 1.8.12 -> 1.8.13 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.9.+ | Adds support for Kotlin 1.7 and above. | -| 1.8.14 | 5.+ -> 7.6.+ | 11+ | 1.0.+ -> 1.9.+ | Fixes compatibility issue with Gradle 7.6 | -| 1.8.15 -> + | 5.+ -> 8.6.+ | 11+ | 1.6.+ -> 1.9.+ | Fixes compatibility issues with Gradle 8.0.
Use JUnit v5.8.0 or above if using Gradle 8 | +| Plugin Version | Gradle Versions | Java Version | Kotlin Version | Notes | +| ---------------- | --------------- | ------------ | -------------- | ------------------------------------------------------------ | +| - -> 1.8.12 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.6.+ | | +| 1.8.12 -> 1.8.13 | 5.+ -> 7.5.+ | 11+ | 1.0.+ -> 1.9.+ | Adds support for Kotlin 1.7 and above. | +| 1.8.14 | 5.+ -> 7.6.+ | 11+ | 1.0.+ -> 1.9.+ | Fixes compatibility issue with Gradle 7.6 | +| 1.8.15 -> 1.8.x | 5.+ -> 8.6.+ | 11+ | 1.6.+ -> 1.9.+ | Fixes compatibility issues with Gradle 8.0.
Use JUnit v5.8.0 or above if using Gradle 8 | +| 2.0.0 | 8.11.+ -> 9.+ | 17+ | 1.8.+ -> 2.x+ | Adds support for Gradle 9.x.
Minimum Java version raised to 17 | Setup === @@ -76,7 +77,7 @@ The main build file should look as follows: ```groovy plugins { - id 'org.javamodularity.moduleplugin' version '1.8.15' apply false + id 'org.javamodularity.moduleplugin' version '2.0.0' apply false } subprojects { @@ -85,8 +86,8 @@ subprojects { version "1.0-SNAPSHOT" - sourceCompatibility = 11 - targetCompatibility = 11 + sourceCompatibility = 17 + targetCompatibility = 17 repositories { mavenCentral() @@ -101,19 +102,21 @@ subprojects { } dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.3.1' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.2' + testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.10.2" } } ``` +
Kotlin DSL ```kotlin plugins { - id("org.javamodularity.moduleplugin") version "1.8.15" apply false + id("org.javamodularity.moduleplugin") version "2.0.0" apply false } subprojects { @@ -124,7 +127,7 @@ subprojects { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(11)) + languageVersion.set(JavaLanguageVersion.of(17)) } } @@ -141,9 +144,10 @@ subprojects { } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter-api:5.3.1") - testImplementation("org.junit.jupiter:junit-jupiter-params:5.3.1") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.3.1") + testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.1") + testImplementation("org.junit.jupiter:junit-jupiter-params:5.10.2") + testImplementation("org.junit.jupiter:junit-jupiter-engine:5.10.2") + testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.2") } } ``` @@ -952,7 +956,7 @@ Please file issues if you run into any problems or have additional requirements! Requirements === -This plugin requires JDK 11 or newer to be used when running Gradle. +This plugin requires JDK 17 or newer to be used when running Gradle. The minimum Gradle version supported by this plugin is 5.1. However, we strongly recommend to use at least Gradle 6.0, because there are a few special cases that cannot be handled correctly when using older versions. diff --git a/build.gradle b/build.gradle index c1e3865..f780018 100644 --- a/build.gradle +++ b/build.gradle @@ -13,10 +13,12 @@ buildScan { } group 'org.javamodularity' -version '1.8.16-SNAPSHOT' +version '2.0.0' -sourceCompatibility = 11 -targetCompatibility = 11 +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} repositories { mavenCentral() @@ -39,8 +41,8 @@ dependencies { testImplementation 'com.google.guava:guava-io:r03' testImplementation "org.junit.jupiter:junit-jupiter-api:$jUnitVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jUnitVersion" + testImplementation "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" testImplementation 'org.junit-pioneer:junit-pioneer:2.2.0' - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // required when testing in Eclipse } @@ -96,21 +98,18 @@ dependencies { gradlePlugin { plugins { + website = 'https://github.com/java9-modularity/gradle-modules-plugin' + vcsUrl = 'https://github.com/java9-modularity/gradle-modules-plugin' modulesPlugin { id = 'org.javamodularity.moduleplugin' displayName = 'Java Modularity Gradle Plugin' description = 'Plugin that makes it easy to work with the Java Platform Module System' implementationClass = 'org.javamodularity.moduleplugin.ModuleSystemPlugin' + tags = ['java', 'modules', 'jpms', 'modularity'] } } } -pluginBundle { - website = 'https://github.com/java9-modularity/gradle-modules-plugin' - vcsUrl = 'https://github.com/java9-modularity/gradle-modules-plugin' - tags = ['java', 'modules', 'jpms', 'modularity'] -} - publishing { // used for publishing to local maven repository publications { pluginMaven(MavenPublication) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a0f7639..bbb57cf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/org/javamodularity/moduleplugin/TestEngine.java b/src/main/java/org/javamodularity/moduleplugin/TestEngine.java index a895102..f2e8a6a 100644 --- a/src/main/java/org/javamodularity/moduleplugin/TestEngine.java +++ b/src/main/java/org/javamodularity/moduleplugin/TestEngine.java @@ -104,7 +104,17 @@ public static Collection selectMultiple(Project project, Set f } + private static Stream getDirectDependencies(Configuration origCfg) { + LOGGER.debug("Configuration {} cannot be resolved, using direct dependencies only", origCfg.getName()); + return origCfg.getDependencies().stream() + .map(dep -> new GroupArtifact(dep.getGroup(), dep.getName())); + } + private static Stream getModuleIdentifiers(Configuration origCfg, Set files) { + if (!origCfg.isCanBeResolved()) { + return getDirectDependencies(origCfg); + } + Configuration cfg = origCfg.copyRecursive(); cfg.setCanBeResolved(true); try { @@ -116,9 +126,7 @@ private static Stream getModuleIdentifiers(Configuration origCfg, .map(dep -> GroupArtifact.fromModuleIdentifier(dep.getModule().getId().getModule())); } catch (ResolveException e) { LOGGER.debug("Cannot resolve transitive dependencies of configuration " + cfg.getName(), e); - LOGGER.info("Using direct dependencies of configuration {}.", origCfg.getName()); - return origCfg.getDependencies().stream() - .map(dep -> new GroupArtifact(dep.getGroup(), dep.getName())); + return getDirectDependencies(origCfg); } } diff --git a/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java b/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java index 1eb396f..3f7b697 100644 --- a/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java +++ b/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java @@ -2,13 +2,17 @@ import org.gradle.api.Project; import org.gradle.api.Task; +import org.gradle.api.artifacts.Dependency; import org.gradle.api.artifacts.ProjectDependency; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; +import org.gradle.api.tasks.TaskContainer; import org.gradle.api.tasks.compile.JavaCompile; +import org.gradle.util.GradleVersion; import org.javamodularity.moduleplugin.extensions.CompileModuleOptions; import java.util.Objects; +import java.util.function.Function; import java.util.stream.Stream; public final class CompileModuleInfoHelper { @@ -32,10 +36,15 @@ public static void dependOnOtherCompileModuleInfoJavaTasks(JavaCompile javaCompi * @return a {@link Stream} of {@code compileModuleInfoJava} tasks from dependent projects */ private static Stream dependentCompileModuleInfoJavaTaskStream(Project project) { + final Function mapToTaskContainer = dependency -> + GradleVersion.current().compareTo(GradleVersion.version("8.11")) < 0 + ? ((ProjectDependency) dependency).getDependencyProject().getTasks() + : project.project(((ProjectDependency) dependency).getPath()).getTasks(); + return project.getConfigurations().stream() .flatMap(configuration -> configuration.getDependencies().stream()) .filter(dependency -> dependency instanceof ProjectDependency) - .map(dependency -> ((ProjectDependency) dependency).getDependencyProject().getTasks()) + .map(mapToTaskContainer) .map(tasks -> tasks.findByName(CompileModuleOptions.COMPILE_MODULE_INFO_TASK_NAME)) .filter(Objects::nonNull) .filter(task -> task.getProject() != project); diff --git a/src/main/java/org/javamodularity/moduleplugin/tasks/AbstractExecutionMutator.java b/src/main/java/org/javamodularity/moduleplugin/tasks/AbstractExecutionMutator.java index 7a0cc19..831304a 100644 --- a/src/main/java/org/javamodularity/moduleplugin/tasks/AbstractExecutionMutator.java +++ b/src/main/java/org/javamodularity/moduleplugin/tasks/AbstractExecutionMutator.java @@ -24,7 +24,7 @@ abstract class AbstractExecutionMutator { protected final String getMainClassName() { if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) < 0) { String mainClassName = Objects.requireNonNull( - execTask.getMain(), + execTask.getMainClass().getOrNull(), "Main class name not found. Try setting 'application.mainClassName' in your Gradle build file." ); if (!mainClassName.contains("/")) { diff --git a/src/main/java/org/javamodularity/moduleplugin/tasks/CompileModuleInfoTask.java b/src/main/java/org/javamodularity/moduleplugin/tasks/CompileModuleInfoTask.java index b4d1002..a10db34 100644 --- a/src/main/java/org/javamodularity/moduleplugin/tasks/CompileModuleInfoTask.java +++ b/src/main/java/org/javamodularity/moduleplugin/tasks/CompileModuleInfoTask.java @@ -71,7 +71,7 @@ public void execute(Task task) { // https://docs.gradle.org/6.1/javadoc/org/gradle/api/file/SourceDirectorySet.html#getClassesDirectory-- classesDir = helper().mainSourceSet().getJava().getClassesDirectory().get().getAsFile(); } else { - classesDir = helper().mainSourceSet().getJava().getOutputDir(); + classesDir = helper().mainSourceSet().getJava().getDestinationDirectory().get().getAsFile(); } File mainModuleInfoFile = new File(classesDir, "module-info.class"); diff --git a/src/main/java/org/javamodularity/moduleplugin/tasks/ModularCreateStartScripts.java b/src/main/java/org/javamodularity/moduleplugin/tasks/ModularCreateStartScripts.java index d26c448..f4b71eb 100644 --- a/src/main/java/org/javamodularity/moduleplugin/tasks/ModularCreateStartScripts.java +++ b/src/main/java/org/javamodularity/moduleplugin/tasks/ModularCreateStartScripts.java @@ -3,6 +3,8 @@ import org.gradle.api.GradleException; import org.gradle.api.Project; import org.gradle.api.plugins.ApplicationPluginConvention; +import org.gradle.api.plugins.JavaApplication; +import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.application.CreateStartScripts; @@ -22,12 +24,12 @@ public ModularCreateStartScripts() { setClasspath(getProject().files()); } + @Input @Nullable - @Override public String getMainClassName() { String main = changedMain; if(main == null) { - main = super.getMainClassName(); + main = super.getMainClass().getOrNull(); } if(main == null) { main = UNDEFINED_MAIN_CLASS_NAME; @@ -35,9 +37,9 @@ public String getMainClassName() { return main; } - @Override public void setMainClassName(@Nullable String mainClassName) { changedMain = mainClassName; + getMainClass().set(mainClassName); } public ModularJavaExec getRunTask() { @@ -59,10 +61,10 @@ private static void configureAfterEvaluate(Project project) { } private static void configure(ModularCreateStartScripts startScriptsTask, Project project) { - var appConvention = project.getConvention().findPlugin(ApplicationPluginConvention.class); - if (appConvention != null) { - var distDir = project.file(project.getBuildDir() + "/install/" + appConvention.getApplicationName()); - startScriptsTask.setOutputDir(new File(distDir, appConvention.getExecutableDir())); + final var appExtension = project.getExtensions().findByType(JavaApplication.class); + if (appExtension != null) { + var distDir = project.file(project.getLayout().getBuildDirectory().get().getAsFile() + "/install/" + appExtension.getApplicationName()); + startScriptsTask.setOutputDir(new File(distDir, appExtension.getExecutableDir())); } ModularJavaExec runTask = startScriptsTask.getRunTask(); diff --git a/src/main/java/org/javamodularity/moduleplugin/tasks/ModularJavaExec.java b/src/main/java/org/javamodularity/moduleplugin/tasks/ModularJavaExec.java index e59b6a5..615b62d 100644 --- a/src/main/java/org/javamodularity/moduleplugin/tasks/ModularJavaExec.java +++ b/src/main/java/org/javamodularity/moduleplugin/tasks/ModularJavaExec.java @@ -65,22 +65,12 @@ public void setJvmArgs(Iterable arguments) { } @Input - @Override public String getMain() { - if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) >= 0) { - return stripModule(getMainClass().getOrNull()); - } else { - return super.getMain(); - } + return stripModule(getMainClass().getOrNull()); } - @Override public JavaExec setMain(String mainClassName) { - if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) >= 0) { - getMainClass().set(stripModule(mainClassName)); - } else { - super.setMain(mainClassName); - } + getMainClass().set(stripModule(mainClassName)); return this; } diff --git a/src/main/java/org/javamodularity/moduleplugin/tasks/StartScriptsMutator.java b/src/main/java/org/javamodularity/moduleplugin/tasks/StartScriptsMutator.java index aa56f45..4b1ee96 100644 --- a/src/main/java/org/javamodularity/moduleplugin/tasks/StartScriptsMutator.java +++ b/src/main/java/org/javamodularity/moduleplugin/tasks/StartScriptsMutator.java @@ -68,10 +68,9 @@ private void configureStartScriptsDoFirst(CreateStartScripts startScriptsTask) { startScriptsTask.setDefaultJvmOpts(jvmArgs); startScriptsTask.setClasspath(project.files()); - if(GradleVersion.current().compareTo(GradleVersion.version("6.4")) < 0) { - if (ModularCreateStartScripts.UNDEFINED_MAIN_CLASS_NAME.equals(startScriptsTask.getMainClassName())) { - startScriptsTask.setMainClassName(execTask.getMain()); - } + final var mainClass = startScriptsTask.getMainClass(); + if (ModularCreateStartScripts.UNDEFINED_MAIN_CLASS_NAME.equals(mainClass.getOrNull())) { + mainClass.set(execTask.getMainClass()); } } diff --git a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java index 42ccefe..d6e6deb 100644 --- a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java +++ b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java @@ -13,7 +13,9 @@ import java.io.File; import java.io.IOException; import java.io.StringWriter; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; @@ -33,10 +35,8 @@ class ModulePluginSmokeTest { @SuppressWarnings("unused") private enum GradleVersion { - v5_1, v5_6, - v6_3, v6_4_1, v6_5_1, v6_8_3, - v7_0, v7_6_4, - v8_0, v8_6 + v8_11, + v9_1_0 ; @Override @@ -70,7 +70,7 @@ void smokeTest( .withProjectDir(new File(projectName + "/")) .withPluginClasspath(pluginClasspath) .withGradleVersion(gradleVersion.toString()) - .withArguments("-c", "smoke_test_settings.gradle", "clean", "build", "run", "--stacktrace") + .withArguments("clean", "build", "run", "--stacktrace") .forwardOutput() .build(); @@ -101,7 +101,7 @@ void smokeTestRun( .withProjectDir(new File(projectName + "/")) .withPluginClasspath(pluginClasspath) .withGradleVersion(gradleVersion.toString()) - .withArguments("-q", "-c", "smoke_test_settings.gradle", "clean", ":greeter.runner:run", "--args", "aaa bbb") + .withArguments("-q", "clean", ":greeter.runner:run", "--args", "aaa bbb") .forwardStdOutput(writer) .forwardStdError(writer) .build(); @@ -135,7 +135,7 @@ void smokeTestJunit5( .withProjectDir(new File("test-project/")) .withPluginClasspath(pluginClasspath) .withGradleVersion(gradleVersion.toString()) - .withArguments("-c", "smoke_test_settings.gradle", junitVersionProperty, junitPlatformVersionProperty, "clean", "build", "run", "--stacktrace") + .withArguments(junitVersionProperty, junitPlatformVersionProperty, "clean", "build", "run", "--stacktrace") .forwardOutput() .build(); @@ -153,7 +153,7 @@ void smokeTestMixed(@CartesianTest.Enum GradleVersion gradleVersion) { .withProjectDir(new File("test-project-mixed")) .withPluginClasspath(pluginClasspath) .withGradleVersion(gradleVersion.toString()) - .withArguments("-c", "smoke_test_settings.gradle", "clean", "build", "--stacktrace") + .withArguments("clean", "build", "--stacktrace") .forwardOutput() .build(); @@ -212,7 +212,7 @@ void smokeTestDist( .withProjectDir(new File(projectName + "/")) .withPluginClasspath(pluginClasspath) .withGradleVersion(gradleVersion.toString()) - .withArguments("-c", "smoke_test_settings.gradle", "clean", "build", ":greeter.runner:installDist", "--stacktrace") + .withArguments("clean", "build", ":greeter.runner:installDist", "--stacktrace") .forwardOutput() .build(); @@ -259,7 +259,7 @@ void smokeTestRunDemo( .withProjectDir(new File(projectName + "/")) .withPluginClasspath(pluginClasspath) .withGradleVersion(gradleVersion.toString()) - .withArguments("-c", "smoke_test_settings.gradle", "clean", "build", + .withArguments("clean", "build", ":greeter.javaexec:runDemo1", ":greeter.javaexec:runDemo2", "--info", "--stacktrace") .forwardOutput() .build(); @@ -284,7 +284,7 @@ void smokeTestRunStartScripts( .withProjectDir(new File(projectName + "/")) .withPluginClasspath(pluginClasspath) .withGradleVersion(gradleVersion.toString()) - .withArguments("-c", "smoke_test_settings.gradle", "clean", ":greeter.startscripts:installDist", "--info", "--stacktrace") + .withArguments("clean", ":greeter.startscripts:installDist", "--info", "--stacktrace") .forwardOutput() .build(); @@ -300,7 +300,7 @@ void smokeTestRunStartScripts( @Test void shouldNotCheckInWithCommentedOutVersions() { - assertEquals(10, GradleVersion.values().length); + assertEquals(2, GradleVersion.values().length); } private static void assertTasksSuccessful(BuildResult result, String subprojectName, String... taskNames) { @@ -326,7 +326,7 @@ private static boolean checkKotlinCombination(String projectName, GradleVersion } private boolean checkJUnitCombination(final String junitVersion, final GradleVersion gradleVersion) { - final boolean gradleEighthPlus = gradleVersion.ordinal() >= GradleVersion.v8_0.ordinal(); + final boolean gradleEighthPlus = gradleVersion.ordinal() >= GradleVersion.v8_11.ordinal(); final Matcher m = SEMANTIC_VERSION.matcher(junitVersion); assumeTrue(m.matches(), "JUnit version not semantic: " + junitVersion); final boolean junitOlderThan5_8_0 = Integer.parseInt(m.group("major")) < 5 || @@ -341,25 +341,30 @@ private boolean checkJUnitCombination(final String junitVersion, final GradleVer private static int javaMajorVersion() { final String version = System.getProperty("java.version"); - return Integer.parseInt(version.substring(0, version.indexOf("."))); + if (version.startsWith("1.")) { + // Java 8 and earlier (1.8.0_xxx format) - not supported anymore but keep for completeness + return Integer.parseInt(version.substring(2, version.indexOf(".", 2))); + } else { + // Java 9+ (9.0.1, 11.0.2, 17.0.2 format) + int dotIndex = version.indexOf("."); + if (dotIndex == -1) { + // Handle cases like "17" without dot + return Integer.parseInt(version); + } + return Integer.parseInt(version.substring(0, dotIndex)); + } + } private boolean jdkSupported(final GradleVersion gradleVersion) { - switch (gradleVersion) { - // CI build runs with early JDK that supports these Gradle version - // But don't fail locally if running local JDK. - // Running JDK 14+ with Gradle 5 runs into: - // https://github.com/gradle/gradle/issues/10248 - case v5_1: - case v5_6: - final int major = javaMajorVersion(); - if (major > 13) { - LOGGER.lifecycle("Unsupported JDK version '{}' for Gradle 5: Test skipped", major); - return false; - } - return true; - default: - return true; + final int javaMajor = javaMajorVersion(); + + // All supported Gradle versions (8.11+) require Java 17+ + if (javaMajor < 17) { + LOGGER.lifecycle("Gradle {} requires Java 17+, but running Java {}: Test skipped", gradleVersion, javaMajor); + return false; } + + return true; } } diff --git a/test-project-groovy/build.gradle b/test-project-groovy/build.gradle index c10cb6d..3428a7c 100644 --- a/test-project-groovy/build.gradle +++ b/test-project-groovy/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.javamodularity.moduleplugin' version '1.8.15' apply false + id 'org.javamodularity.moduleplugin' version '2.0.0' apply false } subprojects { @@ -29,7 +29,8 @@ subprojects { implementation 'org.codehaus.groovy:groovy:3.0.21' testImplementation "org.junit.jupiter:junit-jupiter-api:$jUnitVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jUnitVersion" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" + testImplementation "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" + testRuntimeOnly "org.junit.platform:junit-platform-launcher:$jUnitPlatformVersion" testImplementation("org.spockframework:spock-core:2.4-M1-groovy-3.0") { exclude module: 'groovy-nio' exclude module: 'groovy-test' diff --git a/test-project-groovy/settings.gradle b/test-project-groovy/settings.gradle index 440e773..3aa331e 100644 --- a/test-project-groovy/settings.gradle +++ b/test-project-groovy/settings.gradle @@ -1,3 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal().with { + content { + excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test + } + } + } +} + import org.gradle.util.GradleVersion rootProject.name = 'test-project-groovy' diff --git a/test-project-groovy/smoke_test_settings.gradle b/test-project-groovy/smoke_test_settings.gradle deleted file mode 100644 index 3efe266..0000000 --- a/test-project-groovy/smoke_test_settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal().with { - content { - excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test - } - } - } -} - -apply from: 'settings.gradle' diff --git a/test-project-kotlin-pre-1-7/build.gradle.kts b/test-project-kotlin-pre-1-7/build.gradle.kts index 993d0fe..b78ee60 100644 --- a/test-project-kotlin-pre-1-7/build.gradle.kts +++ b/test-project-kotlin-pre-1-7/build.gradle.kts @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.3.72" apply false - id("org.javamodularity.moduleplugin") version "1.8.15" apply false + id("org.javamodularity.moduleplugin") version "2.0.0" apply false } if (gradle.gradleVersion >= "8.0") { diff --git a/test-project-kotlin-pre-1-7/settings.gradle b/test-project-kotlin-pre-1-7/settings.gradle index d6987f7..911eb20 100644 --- a/test-project-kotlin-pre-1-7/settings.gradle +++ b/test-project-kotlin-pre-1-7/settings.gradle @@ -1,3 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal().with { + content { + excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test + } + } + } +} + import org.gradle.util.GradleVersion rootProject.name = 'test-project-kotlin-pre-1-7' diff --git a/test-project-kotlin-pre-1-7/smoke_test_settings.gradle b/test-project-kotlin-pre-1-7/smoke_test_settings.gradle deleted file mode 100644 index 3efe266..0000000 --- a/test-project-kotlin-pre-1-7/smoke_test_settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal().with { - content { - excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test - } - } - } -} - -apply from: 'settings.gradle' diff --git a/test-project-kotlin/build.gradle.kts b/test-project-kotlin/build.gradle.kts index 7eac545..7eda098 100644 --- a/test-project-kotlin/build.gradle.kts +++ b/test-project-kotlin/build.gradle.kts @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.9.22" apply false - id("org.javamodularity.moduleplugin") version "1.8.15" apply false + id("org.javamodularity.moduleplugin") version "2.0.0" apply false } subprojects { diff --git a/test-project-kotlin/settings.gradle b/test-project-kotlin/settings.gradle index beb5ff1..a1e9334 100644 --- a/test-project-kotlin/settings.gradle +++ b/test-project-kotlin/settings.gradle @@ -1,3 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal().with { + content { + excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test + } + } + } +} + import org.gradle.util.GradleVersion rootProject.name = 'test-project-kotlin' diff --git a/test-project-kotlin/smoke_test_settings.gradle b/test-project-kotlin/smoke_test_settings.gradle deleted file mode 100644 index 3efe266..0000000 --- a/test-project-kotlin/smoke_test_settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal().with { - content { - excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test - } - } - } -} - -apply from: 'settings.gradle' diff --git a/test-project-mixed/build.gradle b/test-project-mixed/build.gradle index cb76c21..f7232f2 100644 --- a/test-project-mixed/build.gradle +++ b/test-project-mixed/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.javamodularity.moduleplugin' version '1.8.15' apply false + id 'org.javamodularity.moduleplugin' version '2.0.0' apply false } subprojects { @@ -25,7 +25,7 @@ subprojects { dependencies { testImplementation "org.junit.jupiter:junit-jupiter-api:$jUnitVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jUnitVersion" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" + testImplementation "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" testRuntimeOnly "org.junit.platform:junit-platform-launcher:$jUnitPlatformVersion" } diff --git a/test-project-mixed/settings.gradle b/test-project-mixed/settings.gradle index 81a152a..18e8cf8 100644 --- a/test-project-mixed/settings.gradle +++ b/test-project-mixed/settings.gradle @@ -1,3 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal().with { + content { + excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test + } + } + } +} + rootProject.name = 'test-project-mixed' include 'greeter.api-jdk8' diff --git a/test-project-mixed/smoke_test_settings.gradle b/test-project-mixed/smoke_test_settings.gradle deleted file mode 100644 index 3efe266..0000000 --- a/test-project-mixed/smoke_test_settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal().with { - content { - excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test - } - } - } -} - -apply from: 'settings.gradle' diff --git a/test-project/build.gradle b/test-project/build.gradle index e193ea0..cd7de28 100644 --- a/test-project/build.gradle +++ b/test-project/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.javamodularity.moduleplugin' version '1.8.15' apply false + id 'org.javamodularity.moduleplugin' version '2.0.0' apply false } subprojects { @@ -27,7 +27,7 @@ subprojects { dependencies { testImplementation "org.junit.jupiter:junit-jupiter-api:$jUnitVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jUnitVersion" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" + testImplementation "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" testRuntimeOnly "org.junit.platform:junit-platform-launcher:$jUnitPlatformVersion" } diff --git a/test-project/settings.gradle b/test-project/settings.gradle index e22c7c0..011d317 100644 --- a/test-project/settings.gradle +++ b/test-project/settings.gradle @@ -1,3 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal().with { + content { + excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test + } + } + } +} + import org.gradle.util.GradleVersion rootProject.name = 'test-project' diff --git a/test-project/smoke_test_settings.gradle b/test-project/smoke_test_settings.gradle deleted file mode 100644 index 3efe266..0000000 --- a/test-project/smoke_test_settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal().with { - content { - excludeGroup 'org.javamodularity.moduleplugin' // added to the classpath by the smoke test - } - } - } -} - -apply from: 'settings.gradle' From 5789e0591bcde486eeab24ba62bf726b3d53cbdb Mon Sep 17 00:00:00 2001 From: Ron Webb Date: Sun, 5 Oct 2025 12:52:35 +1300 Subject: [PATCH 2/7] Update shadow plugin version to 9.2.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f780018..d23e6ac 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id 'java-gradle-plugin' id 'maven-publish' // used for publishing to local maven repository id 'com.gradle.plugin-publish' version '1.2.1' - id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'com.gradleup.shadow' version '9.2.2' id 'com.github.ben-manes.versions' version '0.51.0' } From 25f526950a680a13bf78ae4f542eed9365fea18e Mon Sep 17 00:00:00 2001 From: rcw3bb <43748930+rcw3bb@users.noreply.github.com> Date: Fri, 10 Oct 2025 03:23:03 +1300 Subject: [PATCH 3/7] Update src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java Co-authored-by: Andy Coates <8012398+big-andy-coates@users.noreply.github.com> --- .../org/javamodularity/moduleplugin/ModulePluginSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java index d6e6deb..b4a2a2e 100644 --- a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java +++ b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java @@ -35,7 +35,7 @@ class ModulePluginSmokeTest { @SuppressWarnings("unused") private enum GradleVersion { - v8_11, + v8_11, v8_14_3, v9_1_0 ; From 389d371b36fd5afb6406e6500cadac275b56f95b Mon Sep 17 00:00:00 2001 From: rcw3bb <43748930+rcw3bb@users.noreply.github.com> Date: Fri, 10 Oct 2025 03:23:12 +1300 Subject: [PATCH 4/7] Update src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java Co-authored-by: Andy Coates <8012398+big-andy-coates@users.noreply.github.com> --- .../org/javamodularity/moduleplugin/ModulePluginSmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java index b4a2a2e..1c43944 100644 --- a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java +++ b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java @@ -36,7 +36,7 @@ class ModulePluginSmokeTest { @SuppressWarnings("unused") private enum GradleVersion { v8_11, v8_14_3, - v9_1_0 + v9_0, v9_1_0 ; @Override From 7931ea4630f67ba2c6faced76122b18b21fe8c65 Mon Sep 17 00:00:00 2001 From: rcw3bb <43748930+rcw3bb@users.noreply.github.com> Date: Fri, 10 Oct 2025 03:23:45 +1300 Subject: [PATCH 5/7] Update README.md Co-authored-by: Andy Coates <8012398+big-andy-coates@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c40063..65779c9 100644 --- a/README.md +++ b/README.md @@ -956,7 +956,7 @@ Please file issues if you run into any problems or have additional requirements! Requirements === -This plugin requires JDK 17 or newer to be used when running Gradle. +This latest version of this plugin requires JDK 17 or newer to be used when running Gradle. Older versions support JDK 11. The minimum Gradle version supported by this plugin is 5.1. However, we strongly recommend to use at least Gradle 6.0, because there are a few special cases that cannot be handled correctly when using older versions. From 94b686f7abce032ea0e29e857d76f31c06d46b10 Mon Sep 17 00:00:00 2001 From: Ron Webb Date: Fri, 10 Oct 2025 20:15:34 +1300 Subject: [PATCH 6/7] Code clean up based on PR comment. Also lower the assembled artifact to Java 11. Change to buildScan to develocity since the enterprise is already deprecated. --- build.gradle | 12 ++++++----- settings.gradle | 2 +- .../internal/CompileModuleInfoHelper.java | 5 ++--- .../moduleplugin/ModulePluginSmokeTest.java | 20 ++++++++----------- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/build.gradle b/build.gradle index dddbb62..b590fbe 100644 --- a/build.gradle +++ b/build.gradle @@ -7,17 +7,19 @@ plugins { id 'com.github.ben-manes.versions' version '0.51.0' } -buildScan { - termsOfServiceUrl = 'https://gradle.com/terms-of-service' - termsOfServiceAgree = 'yes' +develocity { + buildScan { + termsOfUseUrl = 'https://gradle.com/help/legal-terms-of-use' + termsOfUseAgree = 'yes' + } } group 'org.javamodularity' version '2.0.0' java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } repositories { diff --git a/settings.gradle b/settings.gradle index 026639d..7c6ca76 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,5 @@ plugins { - id "com.gradle.enterprise" version "3.17.4" + id "com.gradle.develocity" version "4.2.1" } rootProject.name = 'moduleplugin' diff --git a/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java b/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java index 3f7b697..d1fc94b 100644 --- a/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java +++ b/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java @@ -37,9 +37,8 @@ public static void dependOnOtherCompileModuleInfoJavaTasks(JavaCompile javaCompi */ private static Stream dependentCompileModuleInfoJavaTaskStream(Project project) { final Function mapToTaskContainer = dependency -> - GradleVersion.current().compareTo(GradleVersion.version("8.11")) < 0 - ? ((ProjectDependency) dependency).getDependencyProject().getTasks() - : project.project(((ProjectDependency) dependency).getPath()).getTasks(); + project.project(((ProjectDependency) dependency) + .getPath() /* ProjectDependency.getPath() introduced in Gradle 8.11 */).getTasks(); return project.getConfigurations().stream() .flatMap(configuration -> configuration.getDependencies().stream()) diff --git a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java index 1c43944..b10be5c 100644 --- a/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java +++ b/src/test/java/org/javamodularity/moduleplugin/ModulePluginSmokeTest.java @@ -300,7 +300,7 @@ void smokeTestRunStartScripts( @Test void shouldNotCheckInWithCommentedOutVersions() { - assertEquals(2, GradleVersion.values().length); + assertEquals(4, GradleVersion.values().length); } private static void assertTasksSuccessful(BuildResult result, String subprojectName, String... taskNames) { @@ -341,19 +341,15 @@ private boolean checkJUnitCombination(final String junitVersion, final GradleVer private static int javaMajorVersion() { final String version = System.getProperty("java.version"); - if (version.startsWith("1.")) { - // Java 8 and earlier (1.8.0_xxx format) - not supported anymore but keep for completeness - return Integer.parseInt(version.substring(2, version.indexOf(".", 2))); - } else { - // Java 9+ (9.0.1, 11.0.2, 17.0.2 format) - int dotIndex = version.indexOf("."); - if (dotIndex == -1) { - // Handle cases like "17" without dot - return Integer.parseInt(version); - } - return Integer.parseInt(version.substring(0, dotIndex)); + + // Java 9+ (9.0.1, 11.0.2, 17.0.2 format) + int dotIndex = version.indexOf("."); + if (dotIndex == -1) { + // Handle cases like "17" without dot + return Integer.parseInt(version); } + return Integer.parseInt(version.substring(0, dotIndex)); } private boolean jdkSupported(final GradleVersion gradleVersion) { From d43fec328818c4dc92cd0095c5cbaa3a62ec1e0e Mon Sep 17 00:00:00 2001 From: Ron Webb Date: Sat, 11 Oct 2025 11:39:55 +1300 Subject: [PATCH 7/7] Update JDK version in build and publish workflows to 17 --- .github/workflows/build.yml | 4 ++-- .github/workflows/publish.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4b2a6b6..f831a12 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,11 +13,11 @@ jobs: steps: - name: Git checkout uses: actions/checkout@v4 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v4 with: cache: gradle distribution: microsoft - java-version: 11 + java-version: 17 - name: Build with Gradle run: ./gradlew build --scan diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d0ec777..ddb34af 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,12 +23,12 @@ jobs: steps: - name: Git checkout uses: actions/checkout@v4 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v4 with: cache: gradle distribution: microsoft - java-version: 11 + java-version: 17 - name: Create gradle.properties run: echo -e "gradle.publish.key=$GRADLE_PUBLISH_KEY\ngradle.publish.secret=$GRADLE_PUBLISH_SECRET" > gradle.properties - name: Build with Gradle