久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

瀏覽:5日期:2024-08-26 14:19:06

1 概述

IDEA2020.1的文檔中提到只有JFX8的工程才支持打成jar包,并且,如果直接使用Build Artifacts的話,會(huì)如下提示:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

IDEA文檔有提到這個(gè)的解決辦法,是使用一些第三方工具。里面介紹了通過(guò)IDEA結(jié)合自身/Maven/Gradle打包發(fā)布JFX11以上版本的方法。但是,不足的地方有:

直接創(chuàng)建JFX工程默認(rèn)只有一個(gè)src目錄,不像Maven工程還帶有resources與test,給管理資源文件以及外部依賴(lài)造成了困難,getClass().getResource()會(huì)出現(xiàn)空指針問(wèn)題,但是好處是只需具備JDK環(huán)境,打包出來(lái)的文件能帶上jmods能跨平臺(tái)直接運(yùn)行 直接創(chuàng)建Maven項(xiàng)目雖然是管理依賴(lài)以及資源文件方便,但是無(wú)論是直接通過(guò)Maven打出的jar包還是通過(guò)JavaFX Maven Plugins打出來(lái)的jar包默認(rèn)綁定了開(kāi)發(fā)平臺(tái)的JFX SDK,簡(jiǎn)單地說(shuō)就是Linux開(kāi)發(fā)的JFX程序不能直接跑在具有JDK環(huán)境的Win上,因?yàn)橛玫氖荓inux的JFX SDK而不是Win的JFX SDK

因此,本文結(jié)合這兩者的優(yōu)點(diǎn),參照Maven的目錄管理,以JFX工程為基礎(chǔ),記錄了從新建工程到發(fā)布跨平臺(tái)JFX應(yīng)用的過(guò)程。

2 環(huán)境

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

JDK安裝就不說(shuō)了,JFX直接下載然后在工程中通過(guò)外部庫(kù)引入即可,三種jmods解壓出來(lái)即可,用于最后生成可執(zhí)行文件時(shí)添加的模塊。下載鏈接戳這里。

3 新建JFX工程

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

這里的項(xiàng)目名為T(mén)estJFX,對(duì)應(yīng)修改即可。

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

4 添加JFX11 SDK

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

添加上一步下載的對(duì)應(yīng)平臺(tái)的JFX SDK。

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

5 添加module-info.java

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

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

其中TestJFX為新建項(xiàng)目時(shí)的項(xiàng)目名,這個(gè)創(chuàng)建module-info.java時(shí)就默認(rèn)加上了,sample為默認(rèn)包,對(duì)應(yīng)修改。

6 添加VM Options

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

添加

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

其中

/usr/local/jfx/lib

為下載的JFX JDK的lib目錄,后面的out不需要更改,是默認(rèn)的編譯輸出的目錄。

7 運(yùn)行

這時(shí)候應(yīng)該可以Shift+F10或者點(diǎn)擊綠色小三角運(yùn)行了:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

當(dāng)然內(nèi)容是空的,因?yàn)槭裁匆矝](méi)有加。

8 添加資源文件

默認(rèn)的fxml是放在與Main類(lèi)同一目錄下的,getResource()也沒(méi)有加路徑直接寫(xiě)上文件名:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

但是這是src文件夾,放個(gè)fxml還勉強(qiáng)可以接受,放張圖片總不合適吧?所以,新建一個(gè)資源文件夾,把css,fxml什么的都放里面:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

直接在IDEA中移動(dòng)fxml文件,Main中的引用路徑也自動(dòng)更改,不得不說(shuō)這個(gè)特性是真的好用,但遺憾的是,拋出了空指針異常。因此采取絕對(duì)路徑來(lái)進(jìn)行讀取文件,通過(guò)URL+System.getProperty()指定絕對(duì)路徑:

@Overridepublic 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')

獲取項(xiàng)目路徑,注意URL前面要加上“file:”,css的獲取也同理,只不過(guò)是需要轉(zhuǎn)換為String。

9 外部依賴(lài)

由于沒(méi)有了Maven管理依賴(lài),所以外部依賴(lài)的管理會(huì)相對(duì)麻煩一點(diǎn),基本上是以jar包的形式手動(dòng)添加,這里以添加Gson為例,戳這里下載jar包,然后在項(xiàng)目目錄下新建一個(gè)lib文件夾,把jar包放進(jìn)去:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

接著在項(xiàng)目結(jié)構(gòu)中把整個(gè)lib文件夾添加到外部庫(kù):

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

然后VM Options中添加lib路徑,在上面的VM Options后面加一個(gè)冒號(hào)和lib就行:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

但是,此時(shí)可以IDEA還不能進(jìn)行補(bǔ)全,最后需要修改module-info.java:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

加一行requires,此時(shí)IDEA能夠進(jìn)行補(bǔ)全了,每個(gè)jar包都不同,對(duì)應(yīng)修改即可。

10 制作跨平臺(tái)鏡像

運(yùn)行沒(méi)問(wèn)題之后就可以制作運(yùn)行時(shí)鏡像發(fā)布了,終端進(jìn)入項(xiàng)目根路徑:

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

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

其中

jmod/linux

為開(kāi)發(fā)平臺(tái)jmod的路徑,可以是絕對(duì)路徑,也可以是相對(duì)與項(xiàng)目根目錄的相對(duì)路徑,out/production與上面的VM Options保持一致。

--add-modules

后面跟的是模塊名,這是在生成module-info.java時(shí)指定的,為項(xiàng)目名。

--output

為輸出目錄。后一條命令中-m指定模塊名,后面跟包名+主類(lèi)名。這樣linux平臺(tái)的鏡像就制作好了,Mac與Win的同理,只需要把jmod換成對(duì)應(yīng)平臺(tái)的jmod即可,但是注意語(yǔ)法有一些差別,Mac的語(yǔ)法同Linux,只需要把jmod路徑換一下,但是注意需要整個(gè)工程在對(duì)應(yīng)的平臺(tái)進(jìn)行jlink:

jlink --module-path xxxxx/{MAC_JMOD}:out/production:lib --add-modules TestJFX --output macmac/bin/java -m TestJFX/sample.Main

Win的語(yǔ)法有些區(qū)別,一樣需要在Win下進(jìn)行jlink:

jlink --module-path 'xxxxx/{WIN_JMOD};out/production' --add-modules TestJFX --output winwinbinjava -m TestJFX/sample.Main

下面是Win下的截圖:

詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法

11 demo

github

12 參考

Getting Started with JavaFX

到此這篇關(guān)于詳解JFX11+IDEA跨平臺(tái)打包發(fā)布的完美解決辦法的文章就介紹到這了,更多相關(guān)JFX11+IDEA跨平臺(tái)打包內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: IDEA
相關(guān)文章:
主站蜘蛛池模板: 临安市| 绥中县| 历史| 乐平市| 祁连县| 柳江县| 汉寿县| 浦江县| 永吉县| 色达县| 芦山县| 福州市| 民丰县| 资中县| 漳平市| 平顶山市| 正蓝旗| 旺苍县| 北宁市| 鄂伦春自治旗| 永吉县| 休宁县| 自治县| 女性| 巴林左旗| 黑龙江省| 遂昌县| 潮州市| 天峻县| 镇原县| 五峰| 隆安县| 武陟县| 义乌市| 清徐县| 四子王旗| 牟定县| 信宜市| 梅河口市| 南充市| 缙云县|