【问题标题】:Compiling a Gradle Java project with Java 8 but running tests with Java 11使用 Java 8 编译 Gradle Java 项目,但使用 Java 11 运行测试
【发布时间】:2020-10-12 14:15:15
【问题描述】:

作为我项目过渡过程的第一部分,我想继续使用 JDK-8 编译器进行编译,但使用 JDK-11 运行时执行测试。

我的项目是 Gradle 项目(如果重要,则为 6.+),使用 java 插件或 java-library 插件。

我找不到使用 Gradle 选项的方法。

我尝试在一个带有 JDK-8 的终端中编译 (gradlew build),然后切换到另一个带有 JDK 11 的终端并运行测试 (gradlew test),但它重新编译了代码。

正确的做法是什么?

【问题讨论】:

  • 您这样做是因为应用程序将仅在 Java8 环境中运行吗?
  • 我这样做是因为我想逐步进行迁移,并降低风险。正如我在很多地方看到的那样,这一步很常见。我很惊讶用 Gradle 来做这件事并非易事。

标签: java gradle java-11 openjdk-11


【解决方案1】:

您可以使用与运行 Gradle 不同的 JDK 配置所有与 Java 相关的任务(编译、测试、JavaExec、JavaDoc 等)。 user guide 中有一个章节给出了如何使用 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
}

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 2021-02-09
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多