桌面应用分发的痛点:用户机器上不一定有 JDK,让用户自己装 25 既不现实也不优雅。jlink 可以把“应用真正用到的那些 jmod”拼成一个精简的、独立的 JRE,和应用一起打包,用户双击就能跑,体积也比塞一个完整 JDK 小很多。

准备

需要两套 jmods:

  1. JDK 自带的 jmods:在 $JDK_HOME/jmods(openjdk-25 自带)。
  2. JavaFX 的 jmods:要单独下 javafx-jmods-25.0.1,SDK 包里没有,得另找。

两套都必须是 25,版本不一致 jlink 会直接拒绝链接。

命令

核心就是一条 jlink,把 --module-path 指向两个 jmods 目录,--add-modules 列出实际需要的模块:

%JDK_HOME%\bin\jlink ^
--module-path "%JDK_HOME%\jmods;%JAVAFX_JMODS%" ^
--add-modules java.base,java.management,jdk.charsets,javafx.controls,javafx.fxml ^
--output runtime ^
--strip-debug --no-header-files --no-man-pages ^
--compress=zip-6

几个关键参数:

  • --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,对内部分发尤其友好。