1. 概述
本文将深入介绍 Java 14 引入的一个重要工具 —— jpackage
。
该工具旨在帮助开发者将 Java 应用打包为用户友好的原生安装包,从而提升部署体验。对于希望摆脱“双击 JAR 文件运行”这种原始方式的项目来说,这是一个值得掌握的利器。
2. 简介
jpackage
是一个命令行工具,用于为 Java 应用生成原生安装包(native installer),例如 Windows 上的 .msi
或 .exe
、macOS 上的 .dmg
或 .pkg
、Linux 上的 .deb
或 .rpm
。
✅ 它属于 jdk.incubator.jpackage
模块下的孵化功能(incubating feature)。这意味着其命令行参数和打包结构尚未完全稳定,未来可能会有调整。但一旦成熟,它将被正式纳入 Java SE 平台的长期支持(LTS)版本中。
⚠️ 因此,在生产环境使用时需注意版本兼容性风险,建议在 Java 14+ 环境中测试验证。
3. 为什么需要 jpackage?
在实际开发中,我们经常面临这样一个尴尬局面:好不容易写了个桌面工具,发给同事却被告知“打不开,没装 Java”或者“怎么运行?要命令行?”
传统分发方式(直接给 JAR 包)存在明显痛点:
- ❌ 用户必须手动安装匹配版本的 JRE/JDK
- ❌ 启动依赖命令行或脚本,对普通用户不友好
- ❌ 缺乏统一的安装/卸载流程,容易造成系统污染
而 jpackage
的出现正是为了解决这些问题:
✅ 使用 jpackage
打包后,生成的安装包会自动包含精简版 JRE(通过 jlink 机制),用户无需提前安装 Java 环境。
✅ 安装过程与原生应用无异 —— 双击即可安装,开始菜单有快捷方式,控制面板可卸载。
✅ 支持签名、图标定制、启动参数配置等企业级特性。
简单粗暴地说:你的 Java 程序从此可以“像正规软件一样被安装”。
4. 使用前提
要成功使用 jpackage
,需满足以下条件:
4.1 基础环境
- ✅ 目标应用的 JAR 文件已编译完成
- ✅ 当前系统安装了 JDK 14 或更高版本(必须是完整 JDK,JRE 不支持)
- ✅ 安装了对应平台所需的打包工具链
4.2 平台依赖工具
不同操作系统需要不同的底层打包工具:
平台 | 安装包格式 | 所需工具 | 安装方式 |
---|---|---|---|
Linux | deb , rpm |
fakeroot (Ubuntu), rpm-build (Red Hat) |
apt install fakeroot / yum install rpm-build |
macOS | dmg , pkg |
Xcode 命令行工具(尤其是使用 --mac-sign 或 --icon 时) |
xcode-select --install |
Windows | exe , msi |
WiX Toolset 3.0+ | 从 wixtoolset.org 下载安装 |
⚠️ 注意:必须在目标平台上进行打包。也就是说,想生成 Windows 安装包,就得在 Windows 上运行 jpackage
;想打 macOS 版,就得在 Mac 上操作。跨平台交叉编译目前不支持。
5. 打包实战
下面我们通过一个实际例子演示如何使用 jpackage
。
假设你有一个名为 JPackageDemoApp.jar
的应用,主类为 com.baeldung.java14.jpackagedemoapp.JPackageDemoApp
,位于 target/
目录下。
执行以下命令即可生成 macOS 平台的 DMG 安装包:
jpackage --input target/ \
--name JPackageDemoApp \
--main-jar JPackageDemoApp.jar \
--main-class com.baeldung.java14.jpackagedemoapp.JPackageDemoApp \
--type dmg \
--java-options '--enable-preview'
参数详解
参数 | 说明 |
---|---|
--input |
指定包含 JAR 文件的目录(如 target/ ) |
--name |
安装包名称(最终生成 JPackageDemoApp.dmg ) |
--main-jar |
启动时要加载的主 JAR 文件 |
--main-class |
主类全限定名(若 MANIFEST.MF 中已声明可省略) |
--type |
输出包类型,根据平台可选 dmg , pkg , exe , msi , deb , rpm |
--java-options |
传递给 JVM 的启动参数(如启用预览功能) |
执行完成后,你会在当前目录看到生成的 JPackageDemoApp.dmg
文件。双击即可像普通应用一样安装。
其他常见用法补充
添加应用图标(macOS)
jpackage --input target/ \
--name MyApp \
--main-jar app.jar \
--type dmg \
--icon resources/myapp.icns
生成 Windows MSI 安装包(需已安装 WiX)
jpackage --input target/ \
--name MyApp \
--main-jar app.jar \
--type msi \
--vendor "Baeldung Inc." \
--app-version "1.0.0"
自定义 JVM 参数和运行时
jpackage --input target/ \
--name MyApp \
--main-jar app.jar \
--java-options "-Xmx2g -Dspring.profiles.active=prod" \
--runtime-image /path/to/custom/jlink/image
6. 总结
jpackage
是 Java 生态在应用交付体验上的一次重要升级。它让 Java 桌面应用终于能以“正规军”的姿态出现在用户面前。
虽然目前仍处于孵化阶段,但其功能已足够稳定,适合中小型项目尝试使用。特别是对于内部工具、客户端软件、独立服务类应用,jpackage
能极大降低部署门槛。
✅ 推荐场景:
- 内部运维工具分发
- 客户端桌面应用
- 需要自带 JRE 的嵌入式 Java 程序
⚠️ 注意事项:
- 必须在目标平台打包
- 注意版权、签名、图标等合规细节
- 结合
jlink
可进一步减小运行时体积
随着 Java 版本演进,jpackage
功能将持续完善,未来有望成为标准发布流程的一部分。现在上手,正是时候。