上周一个同事找我,说手上有个内部工具要给客户现场演示,客户电脑是台干净的 Windows,没装 Java,双击 jar 包毫无反应,在那边干瞪眼。我远程看了一眼,直接甩了个用 Launch4j 打包好的 exe 过去,对方双击就起来了,全程不用装 JRE。这种场景在 Java 开发里太常见了:你在 IDE 里跑得好好的,交付给没有 Java 环境的用户时,一份 .jar 文件就是一道门槛。Launch4j 干的事情很简单——把 jar 包做成 Windows 双击可执行的 .exe,但它背后牵扯到的 JRE 搜索顺序、内存参数、图标版本信息、无 JRE 环境交付这些事,第一次上手的人基本都会踩坑。这篇就来聊聊我实际打包过程中反复折腾出来的经验,从原理到配置、从踩坑到自动化构建,一次说清楚。
1. Launch4j 到底是干什么的:一个启动器,不是一个编译器
1.1 jar 和 exe 之间到底差了什么
很多刚接触的人会有一个错觉:Launch4j 能把 Java 代码"变"成 Windows 能认识的原生程序。其实完全不是这回事。jar 本质上是一个 zip 压缩包,里面装的还是 .class 字节码,而 Windows 的 exe 需要的是 PE 格式的原生机器码。Launch4j 做的事,是生成一个瘦瘦的原生 Windows 可执行外壳,这个外壳没有任何业务逻辑,它唯一的工作是:
- 按你配置的规则去本机寻找 Java 运行时(JVM)
- 找到后把 jar 路径和 JVM 参数拼成一条类似
java -jar your.jar的命令 - 拉起 JVM,让 Java 代码在 JVM 里跑起来
所以你看,Launch4j 生成的 exe 不是把 jar "吃掉"了,它和 jar 是两个独立的文件。有人打包时把 exe 拷走了、jar 落在原地,结果双击报错,就是这个原因。理解这一点,后面所有配置就都顺了。
1.2 同类工具横评:Launch4j 和 exe4j、jpackage 有什么不一样
我先帮你把市面上常见的几条路捋清楚,免得选错方向白折腾。除了 Launch4j,常用的还有 exe4j、jpackage、GraalVM Native Image 和 JSmooth。
| 方案 | 原理 | 典型适用场景 | 优缺点一眼看 |
|---|---|---|---|
| Launch4j | 原生启动器壳,动态找/捆绑 JRE,启动时调用 java -jar | 有现成 jar、需要灵活控制 JVM 参数、想保留 jar 便于更新 | 免费开源,配置灵活,文档和资料多;exe 本体只是壳 |
| exe4j | 和 Launch4j 类似 | 企业级 GUI 工具,界面友好 | 个人免费但商业收费,一些高级配置藏在付费版 |
| jpackage | JDK 自带打包工具,支持捆绑精简运行时,生成 exe/msi | JDK 14+ 的自动模块化项目 | 官方方案,捆绑 JRE 方便,但定制启动行为不如 Launch4j 灵活 |
| GraalVM Native Image | 把 Java 字节码 AOT 编译成原生机器码 | 对启动速度和内存敏感、不想让用户碰 JRE | 是真编译,启动毫秒级,但部分反射/动态代理场景要额外配置,构建慢 |
我的建议是:如果你主导的项目是传统 Spring 或 Swing/JavaFX 桌面程序,手头已经有打好的 jar,想快速交付一个 Windows 下双击能跑的东西,Launch4j 是最省事的选择。它的配置文件是一个 XML,好改、好备份、好接入 CI。后面章节我会把它和 jlink 搭配起来,做出一个"不装 Java 也能跑"的绿色版,再配合 Maven 插件实现一键构建。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 拿到 Launch4j 之后:下载、安装和两种使用方式
2.1 用 GUI 界面生成第一个 exe
先去 SourceForge 上把 Launch4j 下载下来(认准 3.x 或 4.x 新版,老教程里的 3.9 界面差异很大),解压后你会看到几个关键文件:
launch4j.exe/launch4j.jar:GUI 配置界面launch4jc.exe:命令行工具,读 XML 配置demo目录:自带例子的配置,值得翻
GUI 使用流程基本是四步:
- 打开 launch4j.exe,切到 Basic 页签。
- 填上
Output file(生成的 exe 路径,比如dist/MyApp.exe)和Jar(你的 jar 路径,比如target/MyApp.jar)。 - 切到 JRE 页签,设好
Min/Max version,比如最小 1.8.0,这样用户机器上装了 Java 8 甚至更新版本都能跑。 - 点一下齿轮图标,Build 就完成了。
这四步看起来简单,但你实际用起来会发现问题:路径对不对、JRE 版本写没写、图标怎么没生效、内存参数设多少……下面几个小节逐个拆。
2.2 用 XML 配置文件和命令行模式干活
GUI 适合第一次快速验证,但一旦要批量改配置、交给同事协作或者进 Jenkins,GUI 就累赘了。Launch4j 会在你点 Build 的同时在旁边生成/更新一个 XML 配置文件,你可以把它理解成 GUI 的"源码"。命令行模式只需要一行:
bash复制launch4jc.exe path/to/config.xml
一个最简可运行的 XML 长这样:
xml复制<launch4jConfig>
<dontWrapJar>false</dontWrapJar>
<headerType>gui</headerType>
<jar>target/MyApp.jar</jar>
<outfile>dist/MyApp.exe</outfile>
<errTitl
