为 Java 应用制作 Windows 安装程序:从 jpackage 到 Setup.exe
用 jpackage 把 JAR 和 Java 运行时打包成带原生 .exe 的文件夹,再把这个文件夹封装成 Windows 安装程序,无需 WiX 工具集。
更新于 2026年10月31日 · 阅读约 4 分钟
"请先安装 Java"不是你想对客户说的话。从 JDK 14 开始,jpackage 解决了一半的问题:它把应用和精简过的 Java 运行时打包在一起,并生成一个原生的 MyApp.exe。另一半问题是 Windows 安装程序,而在这一步 jpackage 要求你安装 WiX 工具集并摸清它的各种细节。本指南直接取用 jpackage 生成的文件夹,把它做成 Setup.exe,完全不需要以上这些。
第 1 步:构建应用镜像
把可运行的 JAR 及其依赖 JAR 放进同一个文件夹(下文为 lib/),然后在 Windows 上运行 jpackage:
jpackage --type app-image --name MyApp --input lib --main-jar myapp.jar --main-class com.example.Main --icon app.ico --app-version 2.4.0
这会生成 MyApp/ 文件夹,其中包含:
MyApp.exe,带有你的图标的原生启动器;app/,你的 JAR 文件和一个配置文件;runtime/,只包含应用所需模块的 Java 运行时。
对于 JavaFX 应用,添加指向 JavaFX SDK 的 lib 文件夹的 --module-path,以及 --add-modules javafx.controls,javafx.fxml(按你实际使用的模块调整)。对于模块化应用,用 --module 代替 --main-jar。
打开 MyApp\MyApp.exe,确认应用在系统没有安装 Java 的情况下也能启动。做到这一点靠的就是 runtime/ 文件夹。
要生成 Windows 镜像,jpackage 必须在 Windows 上运行。Windows 电脑、虚拟机或 CI 中的 Windows runner 都可以;可选方案请参阅在 Mac 上构建。
第 2 步:压缩镜像
把 MyApp/ 的内容压缩成 zip:MyApp.exe、app/ 和 runtime/。保持目录结构不变;启动器要求 app/ 和 runtime/ 位于它旁边。
第 3 步:构建安装程序
- 把 zip 上传到 ExeTup。它会把
MyApp.exe选为主程序。 - 填写名称、与
--app-version相同的版本号,以及发布者名称。 - 选择所有用户(Program Files,需要管理员提示)或当前用户(无提示)。分发给员工的 Java 业务应用通常按用户安装;面向消费者的应用通常按机器安装。
- 保持 64 位;jpackage 按 JDK 的架构构建,而几乎所有机器上都是 x64。
- 上传
app.ico,启用快捷方式,然后开始构建。
结果是一个 Windows 安装程序,它把应用镜像放到位,并创建开始菜单项和卸载程序。客户全程看不到 Java。
为什么不直接让 jpackage 生成安装程序?
jpackage --type exe 或 --type msi 确实能生成安装程序,对某些团队来说已经够用。但它需要安装 WiX Toolset 3 并加入 PATH,只提供一个固定的、选项有限的向导,而且它的卸载程序和快捷方式行为有一些粗糙之处,不深入 WiX 很难修改。使用 app-image 加一个独立的安装程序,可以把两件事分开:jpackage 做它擅长的运行时打包,安装程序负责 Windows 集成。
Java 相关说明
- 运行时大小。 精简后的运行时为 40 到 80 MB。
jlink式的模块裁剪会自动进行;--jlink-options --strip-debug和--jlink-options --no-man-pages还能再减少一些。 - Java 选项。 在构建镜像时通过
--java-options "-Xmx1g"传入 JVM 参数;它们会被写入启动器的配置中。 - 更新。 发布一个版本号更高的新安装程序。覆盖安装到上一个版本之上时,会就地替换
app/和runtime/。 - Launch4j 及类似工具把 JAR 包装成
.exe,但默认不捆绑运行时,因此并没有省掉"安装 Java"这一步。jpackage 则省掉了。 - 签名。 压缩前先给
MyApp.exe签名,下载后再给Setup.exe签名;请参阅 SmartScreen 指南。
常见问题
客户需要安装 Java 吗?
不需要。jpackage 生成的 runtime/ 文件夹包含应用所需的一切,安装程序会把它和应用一起分发。
不装 WiX 工具集也能安装这个应用吗?
可以。只有 jpackage 自带的 exe 和 msi 类型才需要 WiX。改为构建 app-image,然后用 ExeTup 制作安装程序即可。
支持 JavaFX 吗?
支持。构建镜像时加入 JavaFX 模块,测试 MyApp.exe,然后按上文的方式打包文件夹。
可以捆绑别的 JDK,比如 Temurin 吗?
jpackage 使用运行它的那个 JDK 作为运行时。用你想分发的 JDK 来运行它,或者通过 --runtime-image 传入一个用 jlink 构建的运行时。
相关指南
- 如何为 Windows 应用制作 Setup.exe(无需编写代码)了解 Setup.exe 实际做了什么、制作安装程序的三种方式,以及如何无需编写安装脚本,几分钟内把应用文件夹变成专业的安装程序。
- 将 .exe 转换为 Windows 安装程序(exe 转 Setup.exe)如何把一个普通的 .exe,或者包含 .exe 的文件夹,转换为带快捷方式和卸载程序的真正 Windows 安装程序,无需编写安装脚本。
- 为 .NET 应用制作 Windows 安装程序(WPF、WinForms、控制台)用 dotnet publish 发布 .NET 桌面应用,在依赖框架与独立部署之间做出选择,然后把发布文件夹打包成带快捷方式和卸载程序的 Setup.exe。