作为我的项目过渡过程的第一部分,我想继续使用 JDK-8 编译器进行编译,但使用 JDK-11 运行时执行测试。
我的项目是 Gradle 项目(6.+,如果重要的话),使用
java
插件或 java-library
插件。
我找不到使用 Gradle 选项来做到这一点的方法。
我尝试在一个终端中使用 JDK-8 进行编译 (
gradlew build
),然后切换到另一个使用 JDK 11 的终端并运行测试 (gradlew test
),但它重新编译了代码。
正确的做法是什么?
您可以使用与运行 Gradle 不同的 JDK 来配置所有与 Java 相关的任务(编译、测试、JavaExec、JavaDoc 等)。 用户指南中有一章提供了如何使用 Java 8 运行 Gradle 但在所有任务中使用 Java 7 的示例。它与 Java 11 的工作原理相同。
对于您的项目,您可以继续使用 Java 8 运行 Gradle,但添加以下内容以使用不同版本运行测试:
// Gradle <= 6.6 (Groovy DSL)
tasks.withType(Test) {
executable = new File("/my/path/to/jdk11/bin/java")
}
用户指南有一个更可配置的解决方案,但这就是它的要点。
即将推出的 Gradle 6.7 版本的一个很酷的功能是对 JVM 工具链的支持。现在,您必须自己下载 JDK 11 发行版并配置它的路径。较新的版本将允许您声明版本,并让 Gradle 为您下载它(从 AdoptOpenJDK)(如果缺少):
// Gradle >= 6.7 (Groovy DSL)
// Unreleased at the time of this writing and the syntax is therefore subject to change
test {
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(11)
}
}
最后一个选项是使用 Java 11 运行 Gradle,并使用
release
选项使编译器以 Java 8 为目标:
// Run Gradle with Java 11
compileJava {
options.release = 8
}
在顶层build.gradle中:
subprojects {
apply plugin: 'java'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
}
}
tasks.withType(JavaCompile).configureEach {
if (!name.contains("Test")) {
options.compilerArgs << '--release' << '8'
}
}
}
(或者如果您愿意,可以在每个子项目中进行)
这使用 Gradle 工具链,在 Gradle 7.0 及以上版本中可用。