用 jlink 给 JavaFX 桌面应用生成精简自定义 JRE
为什么用 jlink
桌面应用分发的痛点:用户机器上不一定有 JDK,让用户自己装 25 既不现实也不优雅。jlink 可以把“应用真正用到的那些 jmod”拼成一个精简的、独立的 JRE,和应用一起打包,用户双击就能跑,体积也比塞一个完整 JDK 小很多。
准备
需要两套 jmods:
- JDK 自带的 jmods:在
$JDK_HOME/jmods(openjdk-25 自带)。 - JavaFX 的 jmods:要单独下
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!
评论
