用 jlink 给 JavaFX 桌面应用生成精简自定义 JRE
为什么用 jlink
桌面应用分发有个痛点:用户机器上不一定有 JDK,让用户自己装个 25 既不现实也挺难受。jlink 可以把”应用真正用到的那些 jmod”拼成一个精简的、独立的 JRE,跟应用一起打包,用户双击就能跑,体积也比塞一个完整 JDK 小很多。
准备
需要两套 jmods:
- JDK 自带的:在
$JDK_HOME/jmods(openjdk-25 自带)。 - JavaFX 的:要单独下
javafx-jmods-25.0.1,SDK 包里没有,得另外找。
两套都得是 25,版本不一致 jlink 会直接拒绝链接。
命令
核心就一条 jlink,把 --module-path 指向两个 jmods 目录,--add-modules 列出实际要用的模块:
%JDK_HOME%\bin\jlink ^ |
几个参数说一下:
--strip-debug/--no-header-files/--no-man-pages:把非运行必需的东西都砍了,体积掉一大截。--compress=zip-6:高版本里压缩参数的写法变了,别照抄老教程。--add-modules一定列全,漏一个运行时就ClassNotFoundException。
怎么确定要加哪些模块
最稳的办法是先用 IDE 跑通,然后拿 jdeps 分析依赖,它输出的模块列表直接贴进 --add-modules:
jdeps --module-path "%JAVAFX_JMODS%" --print-module-deps --ignore-missing-deps your-app.jar |
手猜模块很容易漏,让 jdeps 跑一遍最省心。
打包
生成的 runtime/ 就是一个完整 JRE,配一个 .bat 调 runtime\bin\java.exe -jar app.jar 就行。最终分发物 = runtime + app.jar + 资源,绿色免安装,用户那边不用配任何环境。
jlink 配 JavaFX,主要门槛就三件事:两套 jmods、版本对齐、模块列全。搞定之后分发包从几百 MB 的完整 JDK 缩到几十 MB 的精简 JRE,内部分发特别合适。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CYK's Blog!
评论
