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 diff --git a/README.md b/README.md index 7ae794d..65779c9 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 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. diff --git a/build.gradle b/build.gradle index 7626bc0..b590fbe 100644 --- a/build.gradle +++ b/build.gradle @@ -3,20 +3,24 @@ 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' } -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 '1.8.16-SNAPSHOT' +version '2.0.0' -sourceCompatibility = 11 -targetCompatibility = 11 +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} repositories { mavenCentral() @@ -39,8 +43,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.3.0' - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jUnitVersion" testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // required when testing in Eclipse } @@ -96,21 +100,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/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/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..d1fc94b 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,14 @@ 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 -> + project.project(((ProjectDependency) dependency) + .getPath() /* ProjectDependency.getPath() introduced in Gradle 8.11 */).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..b10be5c 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, v8_14_3, + v9_0, 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(4, 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,26 @@ 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("."))); + + // 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 d7c3173..2a60b5b 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 743022d..31e2bd5 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 "2.0.0" 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'