From 3a15ac4f057b231f5d48502cefc3afbf45436d57 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Wed, 2 Mar 2022 10:40:32 +0800 Subject: [PATCH 1/6] test: reproduce the problem by a test-project > * What went wrong: > Execution failed for task :greeter.toolchain:compileJava. > > Cannot specify --release via `CompileOptions.compilerArgs` when using `JavaCompile.release`. --- test-project/greeter.toolchain/build.gradle | 18 ++++++++++++++++++ .../java/examples/greeter/api/Greeter.java | 5 +++++ .../src/main/java/module-info.java | 3 +++ test-project/settings.gradle | 4 ++++ 4 files changed, 30 insertions(+) create mode 100644 test-project/greeter.toolchain/build.gradle create mode 100644 test-project/greeter.toolchain/src/main/java/examples/greeter/api/Greeter.java create mode 100644 test-project/greeter.toolchain/src/main/java/module-info.java diff --git a/test-project/greeter.toolchain/build.gradle b/test-project/greeter.toolchain/build.gradle new file mode 100644 index 0000000..38d3809 --- /dev/null +++ b/test-project/greeter.toolchain/build.gradle @@ -0,0 +1,18 @@ +//region NO-OP (DSL testing) + +// one of the supported Java version (prefer LTS version) +def toolchainVer = 17 + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(toolchainVer)) + } +} + +modularity { + // This version should be less than `toolchainVer` because: + // * if the version is same to `toolchainVer` we cannot reproduce the existing problem + // * if the version is greather than `toolchainVer` javac cannot create class files + standardJavaRelease(9) +} +//endregion diff --git a/test-project/greeter.toolchain/src/main/java/examples/greeter/api/Greeter.java b/test-project/greeter.toolchain/src/main/java/examples/greeter/api/Greeter.java new file mode 100644 index 0000000..b47b41a --- /dev/null +++ b/test-project/greeter.toolchain/src/main/java/examples/greeter/api/Greeter.java @@ -0,0 +1,5 @@ +package examples.greeter.api; + +public interface Greeter { + String hello(); +} diff --git a/test-project/greeter.toolchain/src/main/java/module-info.java b/test-project/greeter.toolchain/src/main/java/module-info.java new file mode 100644 index 0000000..f246007 --- /dev/null +++ b/test-project/greeter.toolchain/src/main/java/module-info.java @@ -0,0 +1,3 @@ +module greeter.api { + exports examples.greeter.api; +} \ No newline at end of file diff --git a/test-project/settings.gradle b/test-project/settings.gradle index 913ecd7..2b2b6c7 100644 --- a/test-project/settings.gradle +++ b/test-project/settings.gradle @@ -15,3 +15,7 @@ include 'greeter.runner' include 'greeter.javaexec' include 'greeter.startscripts' + +if(GradleVersion.current().compareTo(GradleVersion.version("6.7")) >= 0) { + include 'greeter.toolchain' +} From 6163723598d0bd5ff0748672507cd934b169718f Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Wed, 2 Mar 2022 11:17:49 +0800 Subject: [PATCH 2/6] fix: use Gradle native implementation to set the `--release` option to compiler --- .../DefaultModularityExtension.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java index d69866a..67ef88f 100644 --- a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java +++ b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java @@ -4,8 +4,10 @@ import org.gradle.api.JavaVersion; import org.gradle.api.Project; import org.gradle.api.Task; +import org.gradle.api.invocation.Gradle; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.tasks.compile.JavaCompile; +import org.gradle.util.GradleVersion; import org.javamodularity.moduleplugin.JavaProjectHelper; import org.javamodularity.moduleplugin.tasks.ClasspathFile; @@ -86,8 +88,23 @@ private void setJavaRelease(JavaCompile javaCompile, int javaRelease) { throw new IllegalStateException("--release option is already set in compiler args"); } - compilerArgs.add("--release"); - compilerArgs.add(String.valueOf(javaRelease)); + if (releaseOptionIsSupported()) { + // using the `convention(Integer)` method instead of the `set(Integer)` method, to let users set overwrite explicitly + javaCompile.getOptions().getRelease().convention(javaRelease); + } else { + compilerArgs.add("--release"); + compilerArgs.add(String.valueOf(javaRelease)); + } + } + + /** + * @see The comment on GitHub issue that says {@code --release} option is added in Gradle 6.6 + * @return true if the version of Gradle is 6.6 or later + */ + private boolean releaseOptionIsSupported() { + boolean supported = GradleVersion.current().compareTo(GradleVersion.version("6.6")) >= 0; + project.getLogger().debug("Is releaseOptionSupported? {}", supported); + return supported; } private JavaProjectHelper helper() { From 68ed16f00ddd18a404c8c5e2633082a3c91ecf88 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Wed, 2 Mar 2022 11:37:33 +0800 Subject: [PATCH 3/6] fix: refer to toolchain config to grab the version of java compiler --- .../DefaultModularityExtension.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java index 67ef88f..e3cad70 100644 --- a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java +++ b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java @@ -6,7 +6,9 @@ import org.gradle.api.Task; import org.gradle.api.invocation.Gradle; import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.compile.JavaCompile; +import org.gradle.jvm.toolchain.JavaToolchainSpec; import org.gradle.util.GradleVersion; import org.javamodularity.moduleplugin.JavaProjectHelper; import org.javamodularity.moduleplugin.tasks.ClasspathFile; @@ -76,6 +78,17 @@ private void configureMixedJavaRelease(int mainJavaRelease, int moduleInfoJavaRe // TODO: Remove this method when Gradle supports it natively: https://github.com/gradle/gradle/issues/2510 private void setJavaRelease(JavaCompile javaCompile, int javaRelease) { String currentJavaVersion = JavaVersion.current().toString(); + if (toolchainIsSupported()) { + JavaToolchainSpec toolchain = project.getExtensions().getByType(JavaPluginExtension.class).getToolchain(); + if (toolchain != null) { + // If toolchain is enabled, the version of java compiler is NOT same to the version of JVM running Gradle + // so we need to get the version of toolchain explicitly as follows + String toolchainVersion = toolchain.getLanguageVersion().map(Object::toString).getOrNull(); + if (toolchainVersion != null) { + currentJavaVersion = toolchainVersion; + } + } + } if (!javaCompile.getSourceCompatibility().equals(currentJavaVersion)) { throw new IllegalStateException("sourceCompatibility should not be set together with --release option"); } @@ -102,9 +115,15 @@ private void setJavaRelease(JavaCompile javaCompile, int javaRelease) { * @return true if the version of Gradle is 6.6 or later */ private boolean releaseOptionIsSupported() { - boolean supported = GradleVersion.current().compareTo(GradleVersion.version("6.6")) >= 0; - project.getLogger().debug("Is releaseOptionSupported? {}", supported); - return supported; + return GradleVersion.current().compareTo(GradleVersion.version("6.6")) >= 0; + } + + /** + * @see The Javadoc that says {@code JavaPluginExtension.getToolchain()} is added in Gradle 6.7 + * @return true if the version of Gradle is 6.7 or later + */ + private boolean toolchainIsSupported() { + return GradleVersion.current().compareTo(GradleVersion.version("6.7")) >= 0; } private JavaProjectHelper helper() { From 357a434beb7cd863220a02a3823ff1d0802070bd Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Wed, 2 Mar 2022 11:47:24 +0800 Subject: [PATCH 4/6] build: build the greeter.toolchain proj with Gradle 6.6 Gradle 6.6 has no toolchain support, but has javaCompile.options.release property. --- test-project/settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-project/settings.gradle b/test-project/settings.gradle index 2b2b6c7..e22c7c0 100644 --- a/test-project/settings.gradle +++ b/test-project/settings.gradle @@ -16,6 +16,6 @@ include 'greeter.runner' include 'greeter.javaexec' include 'greeter.startscripts' -if(GradleVersion.current().compareTo(GradleVersion.version("6.7")) >= 0) { +if(GradleVersion.current().compareTo(GradleVersion.version("6.6")) >= 0) { include 'greeter.toolchain' } From cd90e160e8c92c7d09e662a14e06272d4904970a Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Wed, 2 Mar 2022 11:55:39 +0800 Subject: [PATCH 5/6] chore: remove needless imports --- .../moduleplugin/extensions/DefaultModularityExtension.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java index e3cad70..7f8a481 100644 --- a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java +++ b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java @@ -4,7 +4,6 @@ import org.gradle.api.JavaVersion; import org.gradle.api.Project; import org.gradle.api.Task; -import org.gradle.api.invocation.Gradle; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.compile.JavaCompile; From 2643c30056201b45959cc9b172573e62ad483794 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Wed, 2 Mar 2022 12:33:49 +0800 Subject: [PATCH 6/6] build: use Java 11 for new test project using Java 17 breaks the build in GitHub Actions workflow, because Java 17 has more strict control on the Java module. --- test-project/greeter.toolchain/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-project/greeter.toolchain/build.gradle b/test-project/greeter.toolchain/build.gradle index 38d3809..1c24d51 100644 --- a/test-project/greeter.toolchain/build.gradle +++ b/test-project/greeter.toolchain/build.gradle @@ -1,7 +1,7 @@ //region NO-OP (DSL testing) // one of the supported Java version (prefer LTS version) -def toolchainVer = 17 +def toolchainVer = 11 java { toolchain {