前言
Java 「一次編譯,到處執行」依賴 JRE,但客戶端部署常需單一 .exe 檔。本文整理主流打包工具優缺點,協助選型。
工具對比總表
| 工具 | 類型 | 核心機制 | 需 JRE | 圖形介面支援 | 授權 | 官網 |
| exe4j | Wrapper | 啟動器 + JAR 嵌入/外部 | 是 | 完整 (AWT/Swing/JavaFX) | 共享軟體 | ej-technologies.com |
| JBuilder | IDE 內建 | 原生編譯/打包 | 視配置 | 完整 | 商業 | borland.com |
| NativeJ | Wrapper | 類似 exe4j | 是 | 完整 | 共享軟體 | dobysoft.com |
| Excelsior JET | AOT 編譯器 | 位元組碼 → 原生機器碼 | 否 (除 AWT/Swing/第三方 GUI) | 完整 (需額外 runtime) | 共享軟體 | excelsior-usa.com |
| JShrink | 混淆+打包 | JAR → EXE + 混淆 | 是 | 基本 | 共享軟體 | e-t.com |
| InstallAnywhere | 安裝包產生器 | 多平台安裝程式 (含 JRE 打包) | 可選 (可內建 JRE) | 完整 | 商業 | zerog.com |
| InstallShield | 安裝包產生器 | 功能最強、最複雜 | 可選 | 完整 | 商業 | installshield.com |
核心技術路線差異
1. Wrapper/Launcher 類 (exe4j, NativeJ, JBuilder 打包)
- 原理:產生小型原生 EXE,內建/外掛 JAR,啟動時解壓/載入 JRE 執行
- 優點:相容性最好、支援所有 Java 功能、檔案小、啟動快
- 缺點:目標機必須安裝 JRE (可透過安裝包自動安裝)
- 適用:企業內部分發、已管控 JRE 環境、需快速迭代
2. AOT 編譯類 (Excelsior JET)
- 原理:位元組碼提前編譯為 x86/x64/ARM 機器碼,類似 C++ 編譯
- 優點:無需 JRE、啟動極快、原始碼保護 (反編譯困難)、記憶體佔用低
- 缺點:編譯時間長、AWT/Swing 需額外 runtime、動態類別載入/反射/代理受限、授權昂貴
- 適用:嵌入式、桌面獨立軟體、高安全性需求、舊版 Java 專案 (Java 5/6/7/8)
3. 安裝包產生器 (InstallAnywhere, InstallShield)
- 定位:非單一 EXE,而是跨平台安裝精靈 (Windows/Mac/Linux/Unix)
- 核心價值:內建 JRE、自動安裝服務/捷徑/註冊表/解除安裝、多語言、修補更新
- 選型:InstallAnywhere 專精 Java、上手易;InstallShield 功能最全但學習曲線陡峭
4. 混淆器 (JShrink, ProGuard, Zelix KlassMaster)
- 主要功能:程式碼混淆 (重命名、控制流扁平化、字串加密)
- 附帶打包 EXE 功能屬次要,建議混淆 + exe4j/NativeJ 組合
選型決策樹
- 是否允許要求用戶安裝 JRE?
- 是 → exe4j / NativeJ (成熟、穩定、支援良好)
- 否 → 進入 2
- 是否使用大量 Swing/AWT/JavaFX?
- 是 → Excelsior JET (需購買 runtime 授權) 或 InstallAnywhere 內建 JRE
- 否 → Excelsior JET 最佳原生體驗
- 企業級分發、需安裝精靈、多平台?
- InstallAnywhere (Java 專精) 或 InstallShield (通用最強)
實務建議
- 開發階段:直接用 IDE (IntelliJ/Eclipse) 運行、Maven/Gradle 打包 JAR
- 測試/內部分發:exe4j 產生 Launcher,攜帶 JRE 安裝包
- 正式發布:InstallAnywhere 產出專業安裝包,內建 JRE、自動更新、簽章驗證
- 特殊需求:無 JRE 環境、極致啟動速度、原始碼保護 → Excelsior JET
無銀彈,理解打包機制本質 (Wrapper vs AOT vs Installer),依部署環境與業務約束選擇最適工具組合。