我们是否可以强制使用JDK作为Gradle Java工具链?

o2rvlv0m  于 2023-02-23  发布在  Java
关注(0)|答案(4)|浏览(177)

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)
}
...
uujelgoq

uujelgoq1#

您使用的工具是什么?如果是IntelliJ,则
IntelliJ中的一个特性,它将查找是否配置了java工具链,如果配置了,则使我不可能在其中具有不匹配的配置:
运行配置项目结构〉项目SDK项目结构〉项目语言级别
enter image description here

yks3o0rb

yks3o0rb2#

我终于想出了一个解决办法
现在,我在项目中使用存储在settings.gradle文件中的org.gradle.java.installations.auto-detect=false。在Gradle中使用Java工具链时,这会忽略任何本地安装的Java版本。
因此,它将在第一次运行时下载一个合适的JDK,并在以后的运行中重用这个JDK。

  • 优点 *:我们确保即使本地JRE存在,我们也会下载JDK(例如,我们可以确保tools.jar存在)。
  • 缺点 *:如果机器上存在匹配的JDK,我们也会下载一个JDK。
qij5mzcb

qij5mzcb3#

对于我们这些没有互联网的人来说,* 叹气 *,https://docs.gradle.org/current/userguide/toolchains.html描述了按供应商选择工具链:

java {
    toolchain {
...
        vendor = JvmVendorSpec.ADOPTIUM // or vendor = JvmVendorSpec.matching("Private Build") in my case. find the Vendor = value you need with ./gradlew -q javaToolchains
    }
}

甚至完整的定制刀具链位置:
org.gradle.java.installations.fromEnv=JDK8,JRE17//来自环境变量org.gradle.java.installations.paths=/custom/path/jdk1.8,/shared/jre11

p5fdfcr1

p5fdfcr14#

总是要先加上rt.jar

task runJar(type: JavaExec) {
    classpath = files(new File(System.getProperty('java.home') + File.separator + 'lib' + File.separator + 'rt.jar'))
    classpath += files(jar.archiveFile)
    ...
}
runJar.onlyIf {
    new File(System.getProperty('java.home') + File.separator + 'lib' + File.separator + 'rt.jar')).exists()
}

这可能仍然需要在jar.archiveFile中有一个mainClassName。使用JavaExec,可以设置任何environment变量...包括JAVA_HOME,因此可以根据任务交替设置。但是也可以使用Exec任务,然后直接运行java-jar some.jar
我甚至不太确定,这些“仅运行时”的JRE发行版是否仍然存在?
我只知道没有tools.jar

相关问题