| 方案 | 實現方式 | 優點 | 缺點 |
| Wrapper + JAR 分離 | Launch4j、JSmooth、Exe4J 生成 EXE,外置 JAR | 配置靈活(JVM 參數、圖標、版本信息、單實例、Splash)、JAR 可獨立更新 | 需分發兩個文件 |
| 合併單文件 EXE | Launch4j/Exe4J 打包 JAR 內嵌,或手工 copy /b | 單文件分發極簡 | 更新需重新打包;被壓縮工具識別為 ZIP 可提取 JAR |
| 原生編譯 | GraalVM Native Image、Excelsior JET | 無 JVM 依賴、啟動極快、體積小、逆向難度高 | 動態特性受限(反射/動態代理需配置)、構建複雜、授權成本高 |
手工合併 EXE 示例代碼
C++ (Win32 API)
#include
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow) {
TCHAR exePath[MAX_PATH];
GetModuleFileName(NULL, exePath, MAX_PATH);
char cmd[MAX_PATH + 20];
sprintf(cmd, "java.exe -jar \"%s\"", exePath);
WinExec(cmd, SW_HIDE);
return 0;
}
Delphi
program Launcher;
uses Windows;
begin
WinExec(PChar('java.exe -jar "' + ParamStr(0) + '"'), SW_HIDE);
end.
合併命令
copy /b launcher.exe + app.jar myapp.exe
運行 myapp.exe 即相當於 java -jar myapp.exe(JAR 解析器忽略前導 EXE 數據)。
局限性提醒
- 仍依賴目標機器安裝 JRE/JDK,未實現真正「無運行時」。
- Classpath、系統屬性、模塊化(JPMS)參數需在 Launcher 代碼中硬編碼或讀取配置文件。
- 殺毒軟件可能誤報未簽名 EXE,建議代碼簽名。
現代推薦方案
- 簡單分發:Launch4j(開源、成熟、支持 XML 配置、Maven/Gradle 插件)。
- 企業級/高安全:GraalVM Native Image(AOT 編譯,原生二進制)。
- 安裝包制作:Inno Setup / WiX 打包 JRE + JAR + Launcher 為 MSI/EXE 安裝程序。
- 上一篇文章: WebLogic 8 安全優雅關閉腳本:從明文密碼到 BootIdentity 加密方案
- 下一篇文章: JDK 環境變量配置完全指南:Path、Classpath、註冊表修復與命令行技巧
Copyright ©
程式碼之家 All Rights Reserved