IDEA2020.1的文檔中提到只有JFX8的工程才支持打成jar包,而且,若是直接使用Build Artifacts的話,會以下提示:
IDEA文檔有提到這個的解決辦法,是使用一些第三方工具。裏面介紹了經過IDEA結合自身/Maven/Gradle打包發佈JFX11以上版本的方法。可是,不足的地方有:css
所以,本文結合這二者的優勢,參照Maven的目錄管理,以JFX工程爲基礎,記錄了重新建工程到發佈跨平臺JFX應用的過程。html
JDK安裝就不說了,JFX直接下載而後在工程中經過外部庫引入便可,三種jmods解壓出來便可,用於最後生成可執行文件時添加的模塊。
下載連接戳這裏。java
這裏的項目名爲TestJFX,對應修改便可。
linux
添加上一步下載的對應平臺的JFX SDK。
git
在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
添加bash
--module-path /usr/local/javafx11/lib:out/production
其中app
/usr/local/javafx11/lib
爲下載的JFX JDK的lib目錄,後面的out不須要更改,是默認的編譯輸出的目錄。maven
這時候應該能夠Shift+F10或者點擊綠色小三角運行了:
固然內容是空的,由於什麼也沒有加。
默認的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。
運行沒問題以後就能夠製做運行時鏡像發佈了,終端進入項目根路徑:
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下的截圖: