介绍
jpackage 是 JDK14 正式引入(JEP 392) 的官方打包工具,用于把 Java 应用打包成自带JRE的原生安装包,用户电脑不需要提前安装Java就能直接安装运行。
原理
内部自动调用 jlink 裁剪生成精简JRE,将你的jar/模块、依赖、裁剪JRE一起打包,生成当前操作系统的原生安装程序。
限制:不支持跨平台打包
- Windows 只能打包 exe / msi
- macOS 只能打包 dmg / pkg
- Linux 只能打包 deb / rpm
想要多平台安装包,必须在对应操作系统上分别构建。
支持输出包格式
| 平台 | 输出类型 |
|---|---|
| Windows | .exe、.msi |
| macOS | .dmg、.pkg |
| Linux | .deb(Debian/Ubuntu)、.rpm(CentOS/RHEL) |
另外支持 --type app-image:只生成解压即用的目录(绿色免安装,不是安装程序)
前置依赖
- JDK ≥14,推荐 JDK17+/21 LTS;必须使用JDK,JRE不带jpackage
- Windows额外依赖:WiX Toolset 3.8+(生成msi需要,exe可以不用),安装后加入PATH,
candle /?验证 - macOS:需要Xcode命令行工具,签名打包需要开发者证书
- Linux:打包deb/rpm需要对应系统打包工具(dpkg/rpmbuild)
打包模式
1)非模块化项目(普通jar,SpringBoot fatjar 属于这类)
jpackage --name MyApp \
--input ./libs \
--main-jar myapp.jar \
--main-class com.demo.Main \
--app-version 1.0.0 \
--dest ./output \
--icon app.ico \
--win-shortcut
--input:存放jar和资源文件的目录--main-jar:主jar包--main-class:入口类,如果jar的MANIFEST已经写好main-class,可省略
2)模块化Java项目(module-info.java)
jpackage --name MyModApp \
--module-path ./mods \
--module demo.module/com.demo.Main \
--app-version 1.0.0
--module-path / -p:模块路径--module / -m:模块名/主类名
常用参数
| 参数 | 说明 |
|---|---|
--name |
应用显示名称 |
--app-version |
版本号 |
--vendor |
开发商/供应商 |
--description |
软件描述 |
--copyright |
版权信息 |
--dest |
输出目录 |
--icon |
图标:Windows .ico,macOS .icns,Linux .png |
--type |
指定输出类型:exe/msi/dmg/pkg/deb/rpm/app-image |
--java-options |
JVM启动参数,例如 --java-options "-Xmx512m" |
--arguments |
程序默认启动参数 |
--win-shortcut |
Windows安装后创建桌面快捷方式 |
--win-menu |
Windows开始菜单创建条目 |
--win-dir-chooser |
Windows安装包允许用户选择安装目录 |
--file-associations |
关联文件后缀(例如双击 .myext 文件打开本程序) |
--add-launcher |
多启动器,一个包内多个入口程序 |
查看完整帮助:
jpackage --help
打包流程简述
- 准备好你的应用jar/模块、资源文件放到input目录
- jpackage 内部调用 jlink,只打包程序用到的模块,生成精简JRE(体积远小于完整JDK)
- 组装应用镜像(app-image目录,包含jre、jar、启动脚本、配置文件)
- 基于app-image,编译生成对应平台的安装包(exe/msi等)
可以分两步:先生成app-image,手动修改里面文件,再打包成安装包,适合需要自定义脚本、配置文件场景。
# 第一步:只生成绿色app-image文件夹
jpackage --type app-image --name MyApp --input libs --main-jar myapp.jar
# 修改app-image内文件
# 第二步:基于app-image打包成exe
jpackage --name MyApp --app-image ./MyApp --dest output
优缺点
优点
- JDK官方工具,无需第三方打包工具(launch4j、excelsior jetc等)
- 自带裁剪JRE,用户无需装Java
- 原生安装包,支持桌面快捷方式、开始菜单、文件关联、版本信息、图标
- 支持模块化与普通Jar,支持多启动器
- 配合jlink,JRE体积可控
缺点
- 不能跨平台打包,Windows只能打包Windows程序
- Windows生成MSI依赖WiX,增加环境准备成本
- 打包产物体积仍然偏大(相比GraalVM native-image)
- 不支持AOT编译,仍然是JVM运行模式
- SpringBoot大胖jar打包会有坑,需要额外处理
与同类工具对比
- launch4j:仅把jar包装成exe,不带JRE,需要附带jre文件夹;只能Windows
- jpackage:官方,自动裁剪JRE,多平台安装包;需要对应平台构建
- GraalVM Native Image:直接编译为原生机器码,无JRE,体积最小;编译成本高、很多库不支持
- Excelsior JET:商业AOT工具
常见踩坑
- 路径不要带中文/空格,容易打包失败
- 图标格式严格对应平台,格式错误会静默跳过图标
- Windows WiX安装后,必须把wix的bin目录加入系统PATH,否则无法生成msi
- jpackage必须用JDK,不能用JRE执行
- 打包输出目录最好是空目录,旧文件会被复用引发异常
- 防火墙/杀毒软件可能拦截exe生成