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

Java 程序發布實戰:自帶 JRE 實現零依賴部署

     編輯:J2SE

痛點:JRE 版本地獄與安裝門檻

  • 用戶環境無 JRE、版本不匹配 (1.4/1.5/1.6 混存)、權限不足無法安裝。
  • .NET CLR 隨 Windows Update 推送,安裝體驗優於 JRE。
  • 傳統方案:打包安裝程序 (InstallShield/NSIS) 捆綁 JRE,體積大、升級麻煩。

核心機制:java.exe 查找 JRE 邏輯

依據《Java 深度歷險》王森解析,java.exe 啟動時按序查找:

  1. 自身所在目錄下的 jre 子目錄
  2. 父目錄下的 jre 子目錄
  3. Windows 註冊表 HKLM\Software\JavaSoft\Java Runtime Environment
關鍵洞見:將 JRE 放在 java.exe 父目錄下,即可實現「自帶 JRE,優先使用,不依賴註冊表」。

實操步驟:構建獨立運行包

1. 目錄結構規劃

MyApp/
├── MyApp.jar          # 應用主 JAR
├── jre/               # 複製安裝目錄 %JAVA_HOME%/jre 全部內容
│   ├── bin/java.exe   # 關鍵啟動器
│   ├── lib/rt.jar     # 核心類庫
│   └── ...

2. 驗證獨立運行


cd MyApp
set PATH=.\jre\bin;%PATH%
java -verbose -jar MyApp.jar
# 輸出應包含:
# [Opened .\jre\lib\rt.jar]
# [Opened .\jre\lib\jce.jar]
# ...

3. 精簡 JRE 體積 (可選,風險自負)

可刪減項目說明
jre/bin/*.exe 除 java.exe/javaw.exe保留雙擊運行與無控制台運行入口
jre/lib/ 除 rt.jar, jsse.jar, jce.jar, charsets.jar核心類庫、安全、字符集,其餘視依賴裁剪
jre/lib/ext/擴展包,若無用可清空
jre/lib/arch/ 非當前平台目錄如 i386/amd64 僅保留目標架構
jre/lib/zi/ 非目標時區僅保留 Asia/Shanghai 等所需時區
jre/*.txt, *.html, license/文檔授權文件
精簡後約 50MB → 可進一步用 ProGuard 壓縮 rt.jar 或定制 jlink (Java 9+) 產生極小運行時。測試全覆蓋前勿上線。

進階:原生 EXE 封裝 (雙擊即運行)

C++ Win32 Launcher 代碼


#include 
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow) {
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    // 啟動 .\jre\bin\javaw.exe -jar MyApp.jar
    if (!CreateProcess(
        ".\\jre\\bin\\javaw.exe",           // 應用程序名
        ".\\jre\\bin\\javaw.exe -jar MyApp.jar", // 命令行
        NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
        MessageBox(NULL, "啟動失敗", "錯誤", MB_ICONERROR);
        return 1;
    }
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
    return 0;
}
  • VS 編譯為 MyApp.exe,放入 MyApp/ 根目錄。
  • 用戶雙擊 MyApp.exe,無感知啟動 Java 程序,體驗同原生 Win32 應用。

現代替代方案 (Java 9+)

結語

「自帶 JRE + 相對路徑啟動」是 Java 6/7 時代解決零依賴部署的經典技巧,原理簡單、兼容性極佳。現代項目首選 jlink + jpackage 或 GraalVM Native Image,獲得更小體積、更快啟動、更原生的分發體驗。無論工具如何演進,**「運行時隨應用走」**始終是 Java 客戶端分發的核心哲學。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
工具特點適用版本
jlink模塊化定制運行時,體積極小 (10-30MB),官方標準Java 9+
jpackage生成原生安裝包 (exe/msi/dmg/deb/rpm),含圖標/關聯/自動更新Java 14+
GraalVM Native ImageAOT 編譯為原生機器碼,毫秒啟動、無 JIT、體積小Java 11+ (GraalVM)
Launch4j / JSmooth舊版 Java 打包 EXE 封裝器,配置靈活Java 6-8