exe4j 向導第 1 步:選擇 32-bit 或 64-bit。**生成的 .exe 位數必須與綁定的 JRE 位數完全一致**,否則啟動報錯 "This application requires a 64-bit JVM" 或無法找到 JRE。
目標:用戶電腦無需安裝 JDK/JRE 即可運行。
MyApp/ ├── myapp.jar └── jre/ (複製完整的 JRE 目錄,如 jre1.8.0_202)
jre (相對於生成的 .exe 位置)。生成的 .exe 與 jre 目錄同級放置,打包發布時整個 MyApp 目錄一起拷貝。
現象:IDE 運行正常,exe4j 打包後圖標/圖片不顯示。
原因:Jar 包內資源無法用 File 或絕對 URL 訪問,必須用類加載器。
修正代碼:
// 錯誤
ImageIcon icon = new ImageIcon("frame.png");
ImageIcon icon = new ImageIcon(new URL("file:frame.png"));
// 正確:類加載器獲取資源流
ImageIcon icon = new ImageIcon(
ImageIO.read(getClass().getClassLoader().getResourceAsStream("frame.png"))
);
// 或
ImageIcon icon = new ImageIcon(
getClass().getClassLoader().getResource("frame.png")
);
關鍵:圖片所在包/目錄必須在 exe4j "Resources" 步驟中勾選為 "Resource" (而非 "Class"),確保打包進 exe 內部資源區。
main 方法的類。-Xms256m -Xmx512m -Dfile.encoding=UTF-8。exe4j 生成的目錄包含 jre (約 100MB+),直接發送太大。Inno Setup 可壓縮至 30-40MB。
[Setup]
AppName=MyApp
AppVersion=1.0
DefaultDirName={pf}\MyApp
DefaultGroupName=MyApp
Compression=lzma/ultra64
SolidCompression=yes
OutputDir=dist
OutputBaseFilename=MyApp-Setup
[Files]
; 關鍵:Source 指向 MyApp 目錄 (包含 myapp.exe 和 jre 子目錄)
; DestDir 指向安裝目錄
Source: "MyApp\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
Name: "{group}\MyApp"; Filename: "{app}\myapp.exe"
Name: "{commondesktop}\MyApp"; Filename: "{app}\myapp.exe"
[Files] 區塊 Source **必須指向包含 jre 目錄的父目錄** (上例中為 MyApp),而不是直接指向 myapp.exe 或 jre。否則安裝後目錄結構錯亂,exe 找不到相對路徑的 jre。
myapp.jar (含依賴或配合 maven-shade-plugin / spring-boot-maven-plugin)。jre/。myapp.exe 到項目根目錄。myapp.exe 獨立運行 (無 JRE 環境機器)。MyApp-Setup.exe。| 工具 | 優點 | 缺點 |
|---|---|---|
| Launch4j | 免費開源、Ant/Maven 插件完善 | GUI 配置弱、JRE 綁定較繁瑣 |
| jpackage (JDK 14+) | 原生支持、生成 MSI/DMG/DEB、模組化裁剪 JRE (jlink) | 需 JDK 14+、學習曲線、舊版本遷移成本高 |
| GraalVM Native Image | 原生機器碼、啟動極快、無 JRE、體積小 | 反射/動態代理/ JNI 需配置、構建慢、生態適配中 |