diff --git a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java
index d69866a..7f8a481 100644
--- a/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java
+++ b/src/main/java/org/javamodularity/moduleplugin/extensions/DefaultModularityExtension.java
@@ -5,7 +5,10 @@
import org.gradle.api.Project;
import org.gradle.api.Task;
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;
@@ -74,6 +77,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");
}
@@ -86,8 +100,29 @@ 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() {
+ 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() {
diff --git a/test-project/greeter.toolchain/build.gradle b/test-project/greeter.toolchain/build.gradle
new file mode 100644
index 0000000..1c24d51
--- /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 = 11
+
+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..e22c7c0 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.6")) >= 0) {
+ include 'greeter.toolchain'
+}