首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 程序打包為 EXE 可執行文件的三種方案對比

     編輯:Java 相關知識

核心原理

  1. Java 應用打包為可執行 JAR(MANIFEST.MF 指定 Main-Class)。
  2. 編寫 Native Launcher(C++/Delphi/Go 等)調用 java -jar app.jar 或直接嵌入 JVM(JNI Invocation API)。
  3. (可選)將 Launcher 與 JAR 合併為單一 EXE(copy /b launcher.exe + app.jar combined.exe),利用 Launcher 讀取自身尾部 JAR 數據。

方案對比

手工合併 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 安裝程序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案實現方式優點缺點
Wrapper + JAR 分離Launch4j、JSmooth、Exe4J 生成 EXE,外置 JAR配置靈活(JVM 參數、圖標、版本信息、單實例、Splash)、JAR 可獨立更新需分發兩個文件
合併單文件 EXELaunch4j/Exe4J 打包 JAR 內嵌,或手工 copy /b單文件分發極簡更新需重新打包;被壓縮工具識別為 ZIP 可提取 JAR
原生編譯GraalVM Native Image、Excelsior JET無 JVM 依賴、啟動極快、體積小、逆向難度高動態特性受限(反射/動態代理需配置)、構建複雜、授權成本高