0.前言
- 當(dāng)一個JavaFX項目結(jié)束了治宣,剩下的就是導(dǎo)出發(fā)布了急侥。原本以為是一件很簡單的事情,可是沒那么容易侮邀,導(dǎo)出的jar包無法運(yùn)行坏怪,報錯無數(shù)。绊茧。铝宵。。按傅。
- 網(wǎng)上有很多導(dǎo)出教程捉超。∥ㄉ埽可是當(dāng)你照搬運(yùn)用的時候拼岳,還是一樣報錯無數(shù)。有一些細(xì)節(jié)方面的東西况芒,包括lib文件夾和bin文件夾的相對位置都會導(dǎo)致報錯惜纸。
- JDK版本不一樣、導(dǎo)出方法不一樣绝骚、項目結(jié)構(gòu)不一樣耐版、項目main方法不一樣都會導(dǎo)致導(dǎo)出的jar包無法運(yùn)行。報錯無數(shù)压汪。
- 以下我按照簡單到復(fù)雜逐一解決各種坑粪牲,盡量適用于各種JDK等。IDE以idea為例止剖。
1.普通java項目的jar包的導(dǎo)出
- 普通java項目是指不包含JavaFX GUI的項目腺阳。
- 這個就比較簡單了落君。也是基礎(chǔ)操作。亭引。绎速。任何JDK版本都能實現(xiàn)。焙蚓。纹冤。但是也是有幾個小坑。
- 步驟如下:
1.1 選中java項目购公,選擇 File -> Project Structure (快捷鍵:Ctrl+Alt+Shift+S)萌京。
1.2 在彈出的窗口中左側(cè)選中"Artifacts",點擊"+"選擇jar君丁,然后選擇"from modules with dependencies"枫夺。
1.3 選擇Main入口
1.4 回到IDEA的主菜單,選擇“Build - Build Artifacts”下的“Build”或者“Rebuild”即可生成最終的可運(yùn)行的jar包
1.5 坑1:導(dǎo)出的jar包無法雙擊運(yùn)行
- 這個一般是注冊表沒修改正確绘闷。沒有增加-jar 這個前綴橡庞。。印蔗。
- 重新安裝一遍jdk就行了
- 或者修改注冊表
HKEY_CLASSES_ROOT\jarfile\shell\open\command下
修改值為"C:\Program Files\Java\jdk-13.0.1\bin\javaw.exe" -jar "%1" %*
2.JDK10之前的版本(含JDK10)的JavaFX項目的導(dǎo)出
- 這個也比較簡單扒最,因為JDK10之前的版本(含JDK10)已經(jīng)內(nèi)置了JavaFX,所以直接參照第一點操作即可华嘹,導(dǎo)出的jar可以直接運(yùn)行吧趣。
- 而且這個版本可以直接導(dǎo)出為exe文件。其他版本的jdk就不能導(dǎo)出為exe文件,會報錯:
Can't build artifact - fx:deploy is not available in this JDK
- 唯一的問題是jdk10是2018年發(fā)布的耙厚,不支持部分新語言特征强挫。且不能使用JavaFX的新版本
- 據(jù)資料說有一個
jpackage
可以在jdk11版本后導(dǎo)出exe文件。薛躬。日后完善如何使用俯渤。 -
導(dǎo)出exe的操作步驟
3. jdk11及后續(xù)版本的JavaFX項目導(dǎo)出(方式1:不包含JavaFX SDK的small jar包)
- 這個就開始有很多坑了。型宝。八匠。
- 當(dāng)在idea中配置JavaFX項目的時候,必須添加如下VM選項才能正常運(yùn)行JavaFX項目(詳細(xì)參看我之前的文章)
--module-path d:\Java\lib\openjfx-11.0.2_windows-x64_bin-sdk\javafx-sdk-11.0.2\lib\ --add-modules javafx.controls,javafx.fxml
- 按照方法1導(dǎo)出jar包后趴酣,直接運(yùn)行會有如下錯誤提示 :
錯誤:找不到或無法加載主類Address.Main
原因:java.lang.NoClassDefFoundError:javafx/application/Application
- 這個比較好解決梨树,增加VM選項即可運(yùn)行這個jar包.(命令行或bat文件或修改注冊表)
java --module-path d:\Java\lib\javafx-sdk-16\lib\ --add-modules javafx.controls,javafx.fxml -jar address.jar
- 因為JavaFX和操作系統(tǒng)有很大關(guān)聯(lián),所以推薦用這個方法岖寞,導(dǎo)出的jar包不包含JavaFXSDK抡四。導(dǎo)出的jar包比較小。這樣仗谆,可以在其他平臺運(yùn)行床嫌。但是跨释,也因為如此胸私,JavaFX SDK文件夾必須完整厌处,不能僅僅包含lib目錄。比如在Windows系統(tǒng)下JavaFX SDK的lib目錄岁疼,必須同時放有bin目錄阔涉。如下圖。否則會有如下報錯捷绒。
Graphics Device initialization failed for : d3d,sw
4. jdk11及后續(xù)版本的JavaFX項目導(dǎo)出(方式2:包含JavaFX SDK的fat jar包)
- 也可以在jar包中包含JavaFX庫瑰排,直接雙擊運(yùn)行jar包即可。
- 導(dǎo)出的jar包體積較大暖侨。
- 只能在特定平臺運(yùn)行
- 步驟如下
4.1 新建一個啟動類替代原本的Main作為主入口
public class AppMain {
public static void main(String[] args){
Main.main(args);
}
}
4.2 添加JavaFX SDK庫
- 這個比較簡單椭住。把JavaFX的lib的jar文件和項目導(dǎo)出的jar包放一起就可以了。(具體要看你的META_INF文件的Class-path的定義)
- 然后比較重要的來了字逗。京郑。idea不會自己打包JAVA SDK的其他文件(如bin文件)。將導(dǎo)致jar包運(yùn)行后無法運(yùn)行(參照第3點的報錯)
-
網(wǎng)上的一個教程如下操作:Directory Content -> path-to/JavaFX SDK/bin on Windows
-
然后葫掉。些举。你會發(fā)現(xiàn)jar運(yùn)行后GUI顯示不正常,有黑邊且控件無法正常顯示俭厚。主要原因是lib和bin文件的相對位置不正確户魏。lib包的上級必須有bin包。如下
- 如下是我的MANIFEST.MF文件
Manifest-Version: 1.0
Main-Class: DocMaker.AppMain
Class-Path: lib/Spire.Doc.jar lib/javax.activation-1.2.0.jar lib/jaxb-impl-2.3.0.jar
lib/jaxb-api-2.3.0.jar lib/jaxb-core-2.3.0.jar lib/luaj-jme-3.0.1.jar lib/luaj-jse-3.0
.1.jar lib/luaj-sources-3.0.1.jar JavaFX_SDK/lib/src.zip JavaFX_SDK/lib/javafx-swt.jar JavaFX_SDK/lib/javafx.web.jar JavaFX_SDK/lib/jav
afx.base.jar JavaFX_SDK/lib/javafx.fxml.jar JavaFX_SDK/lib/javafx.media.jar JavaFX_SDK/lib/javafx.swing.jar JavaFX_SDK/lib/javafx.c
ontrols.jar JavaFX_SDK/lib/javafx.graphics.jar lib/controlsfx-11.0.3.jar JavaFX_SDK/lib/javafx-graphics-1
1.0.2.jar JavaFX_SDK/lib/javafx-graphics-11.0.2-win.jar JavaFX_SDK/lib/javafx-base-11.0.2.jar JavaFX_SDK/lib/javafx-
base-11.0.2-win.jar JavaFX_SDK/lib/javafx-media-11.0.2.jar JavaFX_SDK/lib/javafx-media-11.0.2-win.jar
JavaFX_SDK/lib/javafx-controls-11.0.2.jar JavaFX_SDK/lib/javafx-controls-11.0.2-win.jar
-
如下是output layout頁面的設(shè)置(Directory Content -> path-to/JavaFX SDK/bin on Windows)
5.終極BOSS
- 你以為導(dǎo)出的jar可以運(yùn)行就OK了挪挤?錯了叼丑。。還有一個終極大BOSS扛门,這個問題沒解決鸠信,你就會發(fā)現(xiàn)導(dǎo)出的jar包。尖飞。一些能運(yùn)行症副,一些不能運(yùn)行。政基。偏偏在idea都能正常運(yùn)行贞铣。。
- 主要原因都涉及到外部文件調(diào)用和css文件調(diào)用上沮明。
- (挖坑辕坝,后面補(bǔ)充)
6.繼續(xù)挖坑Jlink
7.繼續(xù)挖坑之Jpackage
參考文章
1.Maven Shade JavaFX runtime components are missing
2.How to open JavaFX.jar file with JDK 11
3.