前一篇已經讓 CalcFX 成為可啟動的 JAR,但它還沒有真正做到「點一下就能執行」的程度。最關鍵的問題是:執行時仍然依賴外部的 JavaFX SDK、ABCL JAR,甚至還得手動設定模組路徑和 classpath。
這篇的重點是把這些依賴一起包進可分發的執行環境,讓使用者不必自己處理啟動細節。兩個常見路線是:
jpackage:直接打出可執行的桌面應用程式包jlink:先製作精簡 runtime,再把應用與依賴放進去前一篇的 JAR 版本雖然已經能被 Java 啟動,但它仍然有幾個明顯問題。
其中最重要的是,它很難像一般桌面程式那樣直接點擊執行,因為:
是可以提供CalcFX.jar的同時,也提供abcl.jar和JavaFX的SDK。將CalcFX.jar和所有依賴複製到publish資料夾:
mkdir -p publish
cp ${JAVAFX_SDK}/* publish
cp <abcl.jar檔案位置> publish
cp CalcFX.jar publish
但這仍然無法解決第三點問題:使用者必須要知道怎麼在啓動時設定模組路徑與 classpath。可以進一步使用jpackage將整個環境打包提供:
jpackage --type app-image \
--name CalcFX \
--input "publish" \
--main-jar CalcFX.jar \
--main-class CalcFX.CalcFX \
--module-path "${SDK_PATH}" \
--add-modules "javafx.controls,javafx.fxml,javafx.graphics" \
--java-options "--enable-native-access=javafx.graphics" \
--java-options "--add-opens java.base/java.lang=ALL-UNNAMED"
完成後會建立與應用名稱同名的資料夾 CalcFX,其中包含一個可執行文件 CalcFX/bin/CalcFX[.exe]。這份可執行文件可以像一般應用一樣雙擊執行,甚至不要求使用者安裝 JRE 環境,因為 jpackage 會連同 JRE 一起打包。
在準備JavaFX開發環境中,只下載了 JavaFX 的 SDK,不過 JavaFX 也提供各個平台的 jmods 檔案。透過這些 jmods 和 jlink,我們可以進一步縮小最終分發的執行環境大小:
jlink --module-path ${MODULE_PATH} \
--add-modules=javafx.controls,javafx.fxml,javafx.graphics \
--output runtime \
--strip-debug --compress=zip-9 \
--no-header-files --no-man-pages
在建立好準備分發的運行環境資料夾runtime後,再將不是jmods的依賴放入,像是主程式的CalcFX.jar和相關依賴的abcl.jar:
cp CalcFX.jar ./runtime
cp <abcl.jar檔案位置> ./runtime
這次只打包這個環境內容:
jpackage --name CalcFX \
--input runtime \
--main-jar CalcFX.jar \
--main-class CalcFX.CalcFX \
--module-path "${MODULE_PATH}" \
--add-modules javafx.controls,javafx.fxml,javafx.graphics \
--type app-image \
--java-options "--enable-native-access=javafx.graphics" \
--java-options "--add-opens java.base/java.lang=ALL-UNNAMED"
以我的環境製作結果來說,兩種做法最終成品大小如下:
| 直接打包 | 分開打包 | |
|---|---|---|
| 大小 | 248.3 MB | 188.9 MB |
