如何通过Gradle将对应版本JRE打包到发行包并修改启动脚本使用内置JRE
Gradle 内置JRE并修改启动脚本配置方案
第一步:配置JRE拷贝逻辑
在你的build.gradle(Groovy DSL)中添加如下配置,将指定的Java 16 JRE打包到发行包中:
plugins { id 'java' id 'application' } // 替换为你的服务主类全限定名 mainClassName = 'com.example.YourServiceMain' // 替换为你本地Java 16 JRE的实际存放路径,也可配置为自动下载对应平台JRE def targetJrePath = file("/home/yourname/env/jdk16/jre") distributions { main { contents { // 将JRE拷贝到发行包的jre目录下,installDist任务会自动同步到build/install/[服务名]/jre from(targetJrePath) { into "jre" // Linux环境可添加权限配置,避免执行权限不足 fileMode 0755 dirMode 0755 } } } }
第二步:自定义启动脚本,优先使用内置JRE
修改startScripts任务的生成逻辑,替换默认的JAVA_HOME查找规则:
startScripts { doLast { // 修改Unix平台启动脚本 unixScript.text = unixScript.text.replace( '#!/usr/bin/env sh', '''#!/usr/bin/env sh # 定位服务安装根目录 APP_HOME=`cd "$(dirname "$0")/.." && pwd` # 强制使用内置JRE,覆盖系统JAVA_HOME JAVA_HOME="$APP_HOME/jre" export JAVA_HOME ''' ) // 无需Windows版本可删除以下Windows脚本修改逻辑 windowsScript.text = windowsScript.text.replace( '@if "%DEBUG%" == "" @echo off', '''@if "%DEBUG%" == "" @echo off set APP_HOME=%~dp0.. set JAVA_HOME=%APP_HOME%\\jre ''' ) } }
验证效果
执行./gradlew installDist命令后:
build/install/[你的服务名]/jre目录下会完整拷贝你指定的Java 16 JREbuild/install/[你的服务名]/bin下的启动脚本会直接调用内置JRE启动服务,完全不依赖系统全局的JAVA_HOME变量
如果需要自动适配不同操作系统下载对应版本JRE,可使用gradle-jdks插件完成自动化配置,无需手动维护本地JRE文件。
内容的提问来源于stack exchange,提问作者Amen
相关产品推荐
相关产品推荐

