如何使用JRE部署JavaFX 11 Desktop應用程序




javafx-11 openjfx (2)

José:我發現我們有同樣的問題需要解決(請參閱我 在Windows上的JavaFX應用程序的自包含應用程序打包中的問題:InnoSetup或javafxpackager? )。 也許,使用JDK的javapackager將是一個“簡單”的解決方案,儘管有許多參數。 就我而言,我已成功通過此工具為Windows上的JavaFX應用程序生成“自包含應用程序打包”?

我有一個JavaFX(JDK 8)桌面業務應用程序,它使用Java Web Start進行部署。 用戶安裝了Java 8,他們只需轉到URL(我的AWS Linux服務器上的公共URL),然後下載/啟動應用程序(使用Web Start)。 我也可以通過將新JAR部署到服務器來輕鬆更新應用程序。 一切都很好。

但是,Oracle已經停止了使用Java 11的Web Start,並且在2018年3月的“Java客戶端路線圖更新”白皮書中,他們建議將JRE與應用程序捆綁在一起(“應用程序的概念是從獨立的JRE單獨分發的,因此,快速消退。“)。 我不能依賴我的用戶留在Java 8 for Web Start,即使他們保持在8,Oracle也需要許可證才能繼續使用Java 8(我沒有,可能會非常昂貴,我更喜歡無論如何與社區一起走向JavaFX 11和OpenJDK)。

我想遷移到JavaFX 11.我遵循OpenJFX的“JavaFX11入門”( https://openjfx.io/openjfx-docs/ ),使用OpenJDK 11.0.1和Gluon的JavaFX SDK 11.0.1(在Netbeans 10vc2上) ),並且已經能夠運行示例應用程序(在我看來,我應該能夠非常輕鬆地將我的JavaFX 8代碼移植到JavaFX 11)。

然而,這是我被困在方向的地方。 如何將其與JRE捆綁在一起並將其部署到我的最終用戶(並提供應用程序更新)? 那裡有一個簡單的方法(甚至是艱難的方式,有一些方向/指南)?

我可以花幾百個小時在JavaFX 11中編寫富有表現力,豐富且有用的桌面業務應用程序,但我該怎麼做呢?

部署工具包(如JWrapper,InstallAnywhere等)是否適合Java 11的這個新時代? Gluon / openjfx.io可能有我錯過的推薦或指南嗎? 我似乎無法從信譽良好的來源找到任何建議或指南,因為我們開發人員如何專注於編寫前端代碼,以便部署應用程序。

感謝您的幫助或指導。


它現在的工作方式是,將程序轉換為模塊,然後將其“鏈接”到所需的所有其他模塊。

這種鏈接過程的結果就是所謂的圖像。 圖像實際上是一個文件樹,其中包含一個帶有一個或多個可立即運行的可執行文件的 bin 目錄。 這個樹是你分發的,通常是zip或tar.gz.

步驟是:

  1. 創建module-info.java
  2. 使用模塊路徑而不是類路徑進行編譯
  3. 像往常一樣從類創建一個jar
  4. 使用JDK的 jmod 工具將jar轉換為 jmod
  5. 將jmod及其所依賴的模塊鏈接到圖像中

編寫模塊描述符

第一步是將應用程序轉換為模塊。 最低限度,這需要在源樹的頂部(即空包中)創建 module-info.java 。 每個模塊都有一個名稱,通常與包名相同,但不一定是。 所以,你的module-info.java可能如下所示:

module com.mcs75.businessapp {
    exports com.mcs75.desktop.businessapp;

    requires java.logging;
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
}

建造

構建時,根本不指定類路徑。 而是指定模塊路徑。

模塊路徑是目錄列表,而不是文件。 每個目錄都包含模塊,這並不奇怪。 隱式包含JDK的 jmods 目錄。 您需要包含的只是包含所需的非JDK模塊的目錄。 在你的情況下,這至少意味著Gluon的JavaFX:

javac -Xlint -g -d build/classes --module-path /opt/gluon-javafx/lib \
    src/java/com/mcs75/desktop/businessapp/*.java

然後你通常的方式創建一個jar:

jar -c -f build/mybusinessapp.jar -C build/classes .

其中包含module-info.class的jar文件被視為模塊化jar。

製作一個jmod

創建jmod通常是一個簡單的過程:

mkdir build/modules
jmod create --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

鏈接

最後,使用JDK的 jlink 命令組合所有內容:

jlink --output build/image \
    --module-path build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp

jlink 創建一個最小的JRE,它只包含您明確添加的模塊(以及那些顯式模塊所需的模塊)。 --add-modules 是指定要添加的內容的必需選項。

與其他JDK工具一樣, --module-path module --module-path 指定包含模塊的目錄。

--launcher 選項使最終圖像樹在其 bin 目錄中具有附加的可執行腳本,其具有給定名稱(等於之前的部分)。 因此, MyBusinessApp=com.mcs75.businessapp 表示“創建一個名為MyBusinessApp的可執行文件,它執行模塊com.mcs75.businessapp。”

因為 jmod create 命令包含一個 jmod create --main-class 選項,所以Java將知道要執行什麼,就像在清單中聲明Main-Class屬性一樣。 如果需要,還可以在 --launcher 選項中顯式聲明要執行的類。

分發

您要分發的是整個圖像文件樹的zip或tar.gz。 用戶應該運行的可執行文件位於映像的 bin 目錄中。 當然,您可以自由添加自己的可執行文件。 只要保留圖像樹的結構,您也可以自由地將其放入任何類型的安裝程序中。

未來的JDK將擁有一個用於創建成熟的本機安裝程序的 打包工具

跨樓宇

由於圖像包含本機二進製文件,因此您需要為每個平台創建一個圖像。 顯然,一種選擇是在Linux系統上構建映像,再在Windows系統上構建映像,再在Mac上構建映像等。

但您也可以使用 jmodjmod 為其他平台創建圖像,無論您在哪裡構建。

只需要幾個額外的步驟。 首先,您將需要其他平台的JDK。 將它們下載為檔案(zip或tar.gz),而不是安裝程序,並將它們解壓縮到您選擇的目錄中。

每個JDK定義一個 平台 字符串。 這通常是<os> - <arch>的形式。 該平台是 java.base 模塊的一個屬性; 您可以通過檢查該模塊來查看任何JDK的平台:

jmod describe path-to-foreign-jdk/jmods/java.base.jmod | grep '^platform'

使用 --target-platform 選項將該平台字符串傳遞給jmod命令:

mkdir build/modules
jmod create --target-platform windows-amd64 \
    --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

最後,在鏈接時,您希望顯式包含其他JDK的 jmods 目錄,因此 jmods 不會隱式包含其自己的JDK模塊:

jlink --output build/image \
    --module-path path-to-foreign-jdk/jmods:build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp




openjfx