JFX11+IDEA跨平臺打包發佈的完美解決辦法

1 概述

IDEA2020.1的文檔中提到只有JFX8的工程才支持打成jar包,而且,若是直接使用Build Artifacts的話,會以下提示:
在這裏插入圖片描述
IDEA文檔有提到這個的解決辦法,是使用一些第三方工具。裏面介紹了經過IDEA結合自身/Maven/Gradle打包發佈JFX11以上版本的方法。可是,不足的地方有:css

  • 直接建立JFX工程默認只有一個src目錄,不像Maven工程還帶有resources與test,給管理資源文件形成了困難,getClass().getResource()會出現空指針問題,可是好處是打包出來的文件能帶上JFX jmods跨平臺直接運行,只需具有JDK環境
  • 直接建立Maven項目雖然是管理文件方便,依賴也很容易處理,可是不管是直接經過Maven打出的jar包仍是經過JavaFX Maven Plugins打出來的jar包默認綁定了開發平臺的JFX SDK,簡單地說就是Linux開發的JFX程序不能直接跑在具備JDK環境的Win上,由於用的是Linux的JFX SDK而不是Win的JFX SDK

所以,本文結合這二者的優勢,參照Maven的目錄管理,以JFX工程爲基礎,記錄了重新建工程到發佈跨平臺JFX應用的過程。html

2 環境

  • IDEA 2020.1
  • OpenJDK 11
  • OpenJFX 11 Linux SDK
  • OpenJFX 11 Linux/Windows/Mac OS X jmods

JDK安裝就不說了,JFX直接下載而後在工程中經過外部庫引入便可,三種jmods解壓出來便可,用於最後生成可執行文件時添加的模塊。
下載連接戳這裏java

3 新建JFX工程

在這裏插入圖片描述
這裏的項目名爲TestJFX,對應修改便可。
在這裏插入圖片描述linux

4 添加JFX11 SDK

在這裏插入圖片描述
添加上一步下載的對應平臺的JFX SDK。
在這裏插入圖片描述git

5 添加module-info.java

在src目錄右鍵New->module-info.java,修改以下:github

module TestJFX {
    requires javafx.fxml;
    requires javafx.controls;
    
    opens sample to javafx.fxml;
    exports sample;
}

其中TestJFX爲新建項目時的項目名,這個建立module-info.java時就默認加上了,sample爲默認包,對應修改。ruby

6 添加VM Options

在這裏插入圖片描述
在這裏插入圖片描述
添加bash

--module-path /usr/local/javafx11/lib:out/production

其中app

/usr/local/javafx11/lib

爲下載的JFX JDK的lib目錄,後面的out不須要更改,是默認的編譯輸出的目錄。maven

7 運行

這時候應該能夠Shift+F10或者點擊綠色小三角運行了:
在這裏插入圖片描述
固然內容是空的,由於什麼也沒有加。

8 添加資源文件

默認的fxml是放在與Main類同一目錄下的,getResource()也沒有加路徑直接寫上文件名:
在這裏插入圖片描述
可是這是src文件夾,放個fxml還勉強能夠接受,放張圖片總不合適吧?因此,新建一個資源文件夾,把css,fxml什麼的都放裏面:
在這裏插入圖片描述
直接在IDEA中移動fxml文件,Main中的引用路徑也自動更改,不得不說這個特性是真的好用,但遺憾的是,拋出了空指針異常。
所以採起絕對路徑來進行讀取文件,經過URL+System.getProperty()指定絕對路徑:

@Override
public void start(Stage primaryStage) throws Exception{
    String path = System.getProperty("user.dir");
    URL fxmlUrl = new URL("file:"+path+"/resources/fxml/sample.fxml");
    Parent root = FXMLLoader.load(fxmlUrl);
    primaryStage.setTitle("Hello World");
    Scene scene = new Scene(root);
    scene.getStylesheets().add(new URL("file:"+path+"/resources/css/1.css").toString());
    primaryStage.setScene(scene);
    primaryStage.show();
}

其中

System.getProperty("user.dir")

獲取項目路徑,注意URL前面要加上「file:」,css的獲取也同理,只不過是須要轉換爲String。

9 製做跨平臺鏡像

運行沒問題以後就能夠製做運行時鏡像發佈了,終端進入項目根路徑:

jlink --module-path /usr/local/javafx11/jmod/linux:out/production --add-modules TestJFX --output output
output/bin/java -m TestJFX/sample.Main

在這裏插入圖片描述
其中

/usr/local/javafx11/jmod/linux

爲開發平臺jmod的路徑,out/production與上面的VM Options保持一致。

--add-modules

後面跟的是模塊名,這是在生成module-info.java時指定的,爲項目名。

--output

爲輸出目錄。
後一條命令中-m指定模塊名,後面跟包名+主類名。
這樣linux平臺的鏡像就製做好了,Mac與Win的同理,只須要把jmod換成對應平臺的jmod便可,可是注意語法有一些差異,Mac的語法同Linux,只須要把jmod路徑換一下,可是注意須要整個工程在對應的平臺進行jlink:

jlink --module-path xxxxx/jfx/jmod/mac:out/production --add-modules TestJFX --output output
output/bin/java -m TestJFX/sample.Main

Win的語法有些區別,同樣須要在Win下進行jlink:

jlink --module-path "xxxxx/jfx/jmod/win;out/production" --add-modules TestJFX --output output
output/bin/java -m TestJFX/sample.Main

下面是Win下的截圖:
在這裏插入圖片描述

10 demo

11 參考

Getting Started with JavaFX

相關文章
相關標籤/搜索