使用 Java 8 编译 Gradle Java 项目,但使用 Java 11 运行测试

问题描述 投票:0回答:2

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

我的项目是 Gradle 项目(6.+,如果重要的话),使用

java
插件或
java-library
插件。

我找不到使用 Gradle 选项来做到这一点的方法。

我尝试在一个终端中使用 JDK-8 进行编译 (

gradlew build
),然后切换到另一个使用 JDK 11 的终端并运行测试 (
gradlew test
),但它重新编译了代码。

正确的做法是什么?

java gradle java-11 openjdk-11
2个回答
2
投票

您可以使用与运行 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
}

0
投票

在顶层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 及以上版本中可用。

© www.soinside.com 2019 - 2024. All rights reserved.