將 Java Swing/JavaFX 應用打包為 Windows 安裝程序,主流方案:exe4j 生成可執行文件 + Inno Setup 製作安裝包。本文記錄關鍵步驟與避坑指南。
「Executable info」→「Executable type」選擇 32-bit 或 64-bit。必須與打包的 JRE 位數一致,否則運行報錯。
「JRE」→「Search Sequence」:
jre 文件夾(如 HJ小助手/jre)目錄結構示例:
HJ小助手/
├── limitvic1.1.jar
├── jre/ # 裁剪後的 JRE,僅含必要模塊
└── limitvic1.1.exe # exe4j 生成
Swing 讀取打包內資源必須用類加載器:
ImageIcon icon = new ImageIcon(ImageIO.read(
getClass().getClassLoader().getResource("frame.png")
));
且資源文件夾必須在 exe4j「Classpath」中標記為「Resource directory」,否則 getResource 返回 null。
點擊「Build」生成 .exe,雙擊運行驗證:
JAVA_HOME 相關報錯[Files]
Source: "HJ小助手\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意:Source 指向包含 jre 文件夾的父目錄,而非 jre 本身
原因:exe 生成的 EXE 相對路徑查找 ./jre,安裝後目錄結構必須保持:
{app}/
├── limitvic1.1.exe
└── jre/
| 現象 | 原因 | 解決 |
|---|---|---|
| 啟動報 "JAVA_HOME not found" | JRE Search Sequence 未指定本地 jre | exe4j 配置本地 jre 目錄並禁用 fallback |
| 圖片不顯示 | 用 File/URL 讀取而非類加載器;資源未標記 Resource directory | 改用 getClass().getClassLoader().getResource();勾選 Resource directory |
| 安裝後運行找不到 jre | Inno Setup Source 指向錯誤層級 | Source 指向包含 jre 的父目錄 |
| 64位系統運行32位EXE報錯 | JRE位數與EXE不匹配 | 統一32位或64位 |
jlink (JDK 9+) 定製最小化 JRE,體積可再減 50%+