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 功能将持续完善,未来有望成为标准发布流程的一部分。现在上手,正是时候。


原始标题:A Guide to jpackage in Java 14