自从Gradle 6.7以来,Gradle引入了JVM的
工具链的概念。
工具链允许定义用于编译/运行项目的JDK版本,该版本与运行gradle的JDK不同。
这很容易在构建脚本中编写:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(15)
}
}
Gradle会在通常的标准本地路径上查找所需的工具链(您甚至可以通过
org.gradle.java.installations.paths
属性提供自己的查找位置),并最终可以下载它。它甚至支持多个OpenJDK供应商。他们的
文档解释了这一切。
因此,对于多项目设置,您可以这样做:
.
├── jdk11
│ ├── build.gradle
│ └── src
├── jdk16
│ ├── build.gradle
│ └── src
├── jdk17
│ ├── build.gradle
│ └── src
├── build.gradle
├── gradle.properties
└── settings.gradle
settings.gradle
rootProject.name = 'THE-project'
include("jdk11", "jdk16", "jdk17")
build.gradle
subprojects {
apply(plugin: "java-library")
}
``
gradle.properties
the property is optional, it is only if additional lookup path are needed
org.gradle.java.installations.paths=/path to panama jdk,/path to loom jdk,etc
jdk11/build.gradle
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
}
}
tasks.withType(JavaCompile) {
options.release.set(11)
}
jdk16/build.gradle
java {
toolchain {
languageVersion = JavaLanguageVersion.of(16)
}
}
tasks.withType(JavaCompile) {
options.release.set(16)
}
jdk17/build.gradle
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
tasks.withType(JavaCompile) {
options.release.set(17)
options.compilerArgs = ['--add-modules=jdk.incubator.foreign',
'--enable-preview',
'-Xlint:preview']
}
我不了解Eclipse,但在IntelliJ IDEA 2021.1中这个工作正常。
我使用JDK 11在shell中运行gradle,而IntelliJ IDEA也设置为使用JDK 11运行Gradle(
设置| 构建工具 | Gradle)。
目前唯一的缺点是,必须使用正确的启动器(例如使用(子)项目的工具链)对JavaExec
任务进行配置。IntelliJ使用JavaExec任务运行主类,这也会受益于此。
tasks.withType(JavaExec){
javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
}
在这个问题上跟踪gradle/gradle#14363。
JavaCompile
任务。在2.3版本中,你需要查看文档不太完整的JavaToolChain
:https://docs.gradle.org/2.3/dsl/org.gradle.api.tasks.compile.JavaCompile.html#org.gradle.api.tasks.compile.JavaCompile:toolChain和https://docs.gradle.org/2.3/javadoc/org/gradle/jvm/toolchain/JavaToolChain.html,但是从2.4版本开始,该工具链已被更加文档不太完整的工具解析器所取代:https://docs.gradle.org/2.4/dsl/org.gradle.api.tasks.compile.JavaCompile.html#org.gradle.api.tasks.compile.JavaCompile:toolResolver - Johan Stuyts