跳到正文

为 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 步:构建安装程序

  1. 把 zip 上传到 ExeTup。它会把 MyApp.exe 选为主程序。
  2. 填写名称、与 --app-version 相同的版本号,以及发布者名称。
  3. 选择所有用户(Program Files,需要管理员提示)或当前用户(无提示)。分发给员工的 Java 业务应用通常按用户安装;面向消费者的应用通常按机器安装。
  4. 保持 64 位;jpackage 按 JDK 的架构构建,而几乎所有机器上都是 x64。
  5. 上传 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 构建的运行时。

相关指南