【发布时间】:2015-03-07 20:07:44
【问题描述】:
我想在 Gradle 构建文件中设置所需的 Java 版本,例如7 或 8 不必指定本地 JDK 安装的实际路径。
这可能吗?
【问题讨论】:
-
您正在寻找 maven 的对应 jvm 版本的强制插件,对吗? github.com/kordamp/enforcer-gradle-plugin
我想在 Gradle 构建文件中设置所需的 Java 版本,例如7 或 8 不必指定本地 JDK 安装的实际路径。
这可能吗?
【问题讨论】:
TLDR; 感谢@franklin-yu “targetCompatibility = '1.7' -> 您的用户可以使用 8 编译并使用 7 运行。”
见Gradle, "sourceCompatibility" vs "targetCompatibility"?
targetCompatibility = '1.7' 可以解决例如Java 7
语言级别使用sourceCompatibility = '1.7'
【讨论】:
targetCompatibility,则默认为sourceCompatibility。
BiFunction 是 Java 8 JDK 的新增功能。如果您的项目依赖于该类,则它不能在 build.gradle 中有targetCompatibility = '1.7',您的用户可以使用 8 编译并使用 7 运行。
这个功能是 just added 到 Gradle 6.7 作为Java toolchains:
// build.gradle.kts
plugins {
id("java-library") // or id("application")
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
}
}
有了这个,Gradle 将自动下载并使用指定 Java 版本的适当 JDK(默认使用 AdoptOpenJDK)。
【讨论】:
你可以试试这个:
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<JavaCompile> {
options.compilerArgs.addAll(arrayOf("--release", "8"))
}
这也将使您遵守 JDK。您还可以看到以下相关问题:
【讨论】:
在build.gradle文件中,添加以下两行:
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
targetCompatibility 定义生成的 JVM 字节码版本(这是您的应用程序用户需要的版本)。 sourceCompatibility 定义了允许哪些源代码构造(例如,您需要 Java 1.8 或更高版本才能在源代码中使用 lambda 表达式)。
【讨论】:
基于 CletusW 的回答。在windows 10中,好像不会自动选择新安装的Java,所以我手动检查一下。
apply plugin: 'java'
java.toolchain.languageVersion = JavaLanguageVersion.of(15) // auto install
// check JDK version
if (!System.getProperty("java.home").contains(java.toolchain.languageVersion.get().toString())) {
def msg = ('JDK in this project: ' + System.getProperty('java.home') + '\n' +
'In this project, you should use JDK-' + java.toolchain.languageVersion.get())
throw new GradleException(msg)
}
【讨论】: