jpackage是JDK 14+引入的原生打包工具,需完整JDK构建(非JRE或精简版),依赖同版本JDK内部模块;Windows打MSI须安装WiX v3.11.x并配置PATH;Linux生成DEB/RPM需显式声明依赖和桌面入口;不支持跨平台交叉编译。

jpackage 在 OpenJDK 中可用,但必须用 JDK 14+ 的完整构建(含 jpackage 工具),不能只装 JRE 或精简版 JDK —— 否则命令根本不存在。
确认 OpenJDK 是否带 jpackage
不是所有 OpenJDK 发行版都默认包含 jpackage。Azul Zulu FX、Liberica JDK FX、Eclipse Temurin(部分版本)和 Oracle OpenJDK 构建通常包含;但标准 Temurin 或某些 Alpine/ slim 镜像可能删掉了它。
执行以下命令验证:
bin/jpackage --version
如果报错 Command not found 或 'jpackage' is not recognized,说明当前 JDK 不含该工具。此时需换用带 jpackage 的发行版,例如:
- Azul Zulu JDK FX(下载时勾选 “Include jpackage”)
- Liberica JDK Full(含 JavaFX + jpackage)
- Oracle OpenJDK 17+(官网下载的 .exe/.dmg/.tar.gz 完整包)
别试图从别的 JDK 复制 jpackage 二进制文件——它强依赖同版本 JDK 的内部模块和启动逻辑,混用大概率失败。
打包前必须生成可运行的胖 JAR 或应用映像
jpackage 不接受源码或 class 目录,只认两种输入:
-
--input <dir>:目录下必须有--main-jar <xxx.jar>指定的可执行 JAR(含所有依赖,即“fat jar”) -
--app-image <dir>:已用jlink构建好的运行时镜像(含bin/java和模块)
对 Spring Boot 或普通 JavaFX 应用,推荐走胖 JAR 路线。Maven 示例:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
或 JavaFX 项目用 maven-assembly-plugin 打 jar-with-dependencies。关键点:
- JAR 必须能独立运行:
java -jar target/app.jar成功启动 -
--main-class必须显式指定(哪怕 MANIFEST.MF 里已有),否则 Windows/Linux 打包会失败 - 不要用
spring-boot-thin-launcher等动态加载机制——jpackage不识别
Windows 打 MSI 安装包必须装 WiX,且版本要对得上
OpenJDK 的 jpackage 在 Windows 上生成 --type msi 时,**完全依赖外部 WiX Toolset**,不自带任何组件。
常见错误现象:
找不到 WiX 工具 (light.exe, candle.exe)错误: 类型 [msi] 无效或不受支持
解决方法:
- 必须安装 WiX v3.11.x(
jpackage对 v3.14+ 兼容性差,v4.x 完全不认) - 安装后确保
candle.exe和light.exe在系统 PATH 中(CMD 运行candle -?应有输出) - 路径含空格(如
C:\Program Files (x86)\WiX Toolset v3.11\)会导致静默失败——建议重装到无空格路径,如C:\wix311\并手动加进 PATH
命令示例(注意路径无空格):
bin/jpackage --type msi \ --name MyApp \ --input target/ \ --main-jar myapp-1.0.jar \ --main-class com.example.Main \ --win-dir-chooser \ --win-shortcut \ --dest dist/
Linux 打 DEB/RPM 前要处理依赖声明和桌面入口
Linux 包不像 Windows 那样“开箱即用”,jpackage 生成的 DEB/RPM 默认不注册桌面菜单项、不声明运行时依赖(比如 libgtk-3-0、libxtst6),用户双击图标可能直接闪退。
关键参数必须加:
-
--linux-app-category Utility(或Development、Network)——决定应用出现在哪个菜单组 -
--linux-menu-group Development——更细粒度分类(GNOME/KDE 用) -
--linux-package-deps "libgtk-3-0, libxtst6, libxrender1"——明文列出 JavaFX 或 Swing 所需的原生库 -
--icon src/main/resources/app-icon.png——PNG 格式,48×48 或 256×256,否则 Debian 软件中心不显示图标
DEB 包安装后,快捷方式在 /usr/share/applications/myapp.desktop;RPM 则在 /usr/share/applications/。若缺失 Exec= 行或 Icon= 路径不对,桌面环境就找不到它。
最常被忽略的一点:jpackage 生成的包是平台绑定的——你不能在 Linux 上生成 Windows MSI,也不能在 macOS 上交叉编译 Linux DEB。每个目标平台必须用对应系统的 JDK + 工具链本地构建,CI/CD 流水线得按平台拆开跑。

















