Java 桌面應用發布時,總面臨「使用者機器是否裝 JRE、版本是否相容」的難題。.NET CLR 隨 Windows 更新自動普及,安裝體驗更友善。若能讓應用程式「自帶 JRE」,像傳統 Win32 程式雙擊即跑,將徹底解決部署焦慮。
參考《Java深度歷險》一書,java.exe 啟動時按順序尋找 JRE:
jre 目錄jre 目錄(關鍵點)只要把 JRE 放在 java.exe 的父目錄,即可繞過系統登錄檔,實現獨立運行。
MyApp/
├── MyApp.jar
└── jre/ ← 複製 C:\Program Files\Java\jre1.5.0 全部內容到此
├── bin/java.exe
└── lib/rt.jar ...
命令列驗證:
set path=c:\MyApp\jre\bin
java -verbose -jar MyApp.jar
輸出 [Opened C:\MyApp\jre\lib\rt.jar] 等訊息,證明載入的是私有 JRE。
license、bin 下除 java.exe/javaw.exe 外的執行檔lib 僅保留 rt.jar, jsse.jar, jce.jar, charsets.jari386、zi (僅保留本地時區) 等子目錄參考 Sun JMF 內建播放器,極致精簡可達數 MB 等級。
用 Visual Studio 建立最小 Win32 GUI 程式,呼叫 CreateProcess 啟動 jre\bin\javaw.exe -jar MyApp.jar,編譯成 MyApp.exe。使用者雙擊 EXE 即可啟動,完全感知不到 Java 存在。
int PASCAL WinMain(...) {
STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess("jre\\bin\\javaw.exe", "jre\\bin\\javaw.exe -jar MyApp.jar",
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
ErrorExit("CreateProcess failed.");
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
}
此法將 Java 桌面應用體驗提升至原生等級,適合對部署簡易性要求高的產品化專案。