如何强制Gradle在Java工具链中为所有任务(含运行)使用JDK?
强制Gradle Java工具链为所有任务使用JDK
Gradle 6.7引入了Java工具链(Java toolchains)。官方文档说明:
Gradle会选择符合构建要求的JRE/JDK……默认情况下,Gradle优先选择已安装的JDK而非JRE……
但如果用户仅安装了JRE,而我们的应用依赖仅存在于JDK中的tools.jar,就需要确保Gradle的所有任务(包括运行/启动类任务,不止编译)都强制使用JDK。
解决方案
可以通过Java工具链的implementation属性强制指定使用JDK实现,修改你的构建脚本如下:
// 确保应用使用JDK 9运行 plugins { id 'application' } java { toolchain { languageVersion = JavaLanguageVersion.of(9) // 强制选择JDK而非JRE implementation = JvmImplementation.JDK } } // 为所有JavaExec任务配置工具链 tasks.withType(JavaExec).configureEach { javaLauncher = javaToolchains.launcherFor(java.toolchain) } task runJar(type: JavaExec) { classpath = files(jar.archiveFile) } ...
说明
implementation = JvmImplementation.JDK会让Gradle在查找工具链时,只筛选JDK类型的安装包,完全忽略JRE。- 如果系统中没有匹配版本的JDK,Gradle会根据你的自动下载配置(若已开启)尝试下载对应版本的JDK;若未开启自动下载,构建会直接失败并提示找不到符合要求的JDK工具链。
- 通过
tasks.withType(JavaExec).configureEach的配置,能确保所有自定义的JavaExec任务(比如示例中的runJar)都遵循这个强制使用JDK的规则,application插件自带的run任务也会自动继承工具链的配置。
内容的提问来源于stack exchange,提问作者Markus Weninger
相关产品推荐
相关产品推荐

