Gradle 6.7引入了Java toolchains。
文档中指出,* Gradle选择符合构建要求的JRE/JDK ...默认情况下,Gradle首选已安装的JDK,而非JRE ... *(来自docs.gradle.org: Toolchains for JVM projects)。
因此,如果同时安装了JRE和JDK,则选择JDK。
- 问题:**
假设用户只安装了JRE。
然而,我们希望使用Java工具链通过Gradle(JavaExec
任务)运行我们的应用程序,但必须确保使用JDK来运行,因为此应用程序依赖tools.jar
,而tools.jar
不是JRE的一部分。
- 问题:**
在使用Java工具链时,是否可以强制Gradle将JDK用于所有任务(包括运行/启动),而不仅仅是编译?(请参阅以下带注解的最小示例)
// This build.gradle should ensure that the application is run using a JDK of version 9
plugins {
id 'application'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(9)
// QUESTION: How to force JDK here? <------
}
}
// for JavaExec task runJar
tasks.withType(JavaExec).configureEach {
javaLauncher = javaToolchains.launcherFor(java.toolchain)
}
task runJar(type: JavaExec) {
classpath = files(jar.archiveFile)
}
...
4条答案
按热度按时间uujelgoq1#
您使用的工具是什么?如果是IntelliJ,则
IntelliJ中的一个特性,它将查找是否配置了java工具链,如果配置了,则使我不可能在其中具有不匹配的配置:
运行配置项目结构〉项目SDK项目结构〉项目语言级别
enter image description here
yks3o0rb2#
我终于想出了一个解决办法
现在,我在项目中使用存储在
settings.gradle
文件中的org.gradle.java.installations.auto-detect=false
。在Gradle中使用Java工具链时,这会忽略任何本地安装的Java版本。因此,它将在第一次运行时下载一个合适的JDK,并在以后的运行中重用这个JDK。
tools.jar
存在)。qij5mzcb3#
对于我们这些没有互联网的人来说,* 叹气 *,https://docs.gradle.org/current/userguide/toolchains.html描述了按供应商选择工具链:
甚至完整的定制刀具链位置:
org.gradle.java.installations.fromEnv=JDK8,JRE17
//来自环境变量org.gradle.java.installations.paths=/custom/path/jdk1.8,/shared/jre11
p5fdfcr14#
总是要先加上
rt.jar
:这可能仍然需要在
jar.archiveFile
中有一个mainClassName
。使用JavaExec
,可以设置任何environment
变量...包括JAVA_HOME
,因此可以根据任务交替设置。但是也可以使用Exec
任务,然后直接运行java
-jar some.jar
。我甚至不太确定,这些“仅运行时”的JRE发行版是否仍然存在?
我只知道没有
tools.jar