2021-04-20_JavaFX導(dǎo)出可運(yùn)行的jar包(解決IDE運(yùn)行正常,導(dǎo)出jar包無法運(yùn)行)

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

1.2 在彈出的窗口中左側(cè)選中"Artifacts",點擊"+"選擇jar君丁,然后選擇"from modules with dependencies"枫夺。

步驟2

1.3 選擇Main入口

步驟3

1.4 回到IDEA的主菜單,選擇“Build - Build Artifacts”下的“Build”或者“Rebuild”即可生成最終的可運(yùn)行的jar包

image.png

image.png

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的操作步驟


    image.png

    image.png

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
image.png

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


    image.png

    image.png
  • 然后葫掉。些举。你會發(fā)現(xiàn)jar運(yùn)行后GUI顯示不正常,有黑邊且控件無法正常顯示俭厚。主要原因是lib和bin文件的相對位置不正確户魏。lib包的上級必須有bin包。如下


    image.png
  • 如下是我的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)


    output layout頁面的設(shè)置

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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荐健,隨后出現(xiàn)的幾起案子酱畅,更是在濱河造成了極大的恐慌琳袄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺酸,死亡現(xiàn)場離奇詭異窖逗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)餐蔬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門碎紊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人樊诺,你說我怎么就攤上這事仗考。” “怎么了词爬?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵秃嗜,是天一觀的道長。 經(jīng)常有香客問我顿膨,道長锅锨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任虽惭,我火速辦了婚禮橡类,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芽唇。我一直安慰自己顾画,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布匆笤。 她就那樣靜靜地躺著研侣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炮捧。 梳的紋絲不亂的頭發(fā)上庶诡,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音咆课,去河邊找鬼末誓。 笑死,一個胖子當(dāng)著我的面吹牛书蚪,可吹牛的內(nèi)容都是我干的喇澡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼殊校,長吁一口氣:“原來是場噩夢啊……” “哼晴玖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤呕屎,失蹤者是張志新(化名)和其女友劉穎让簿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秀睛,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡尔当,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了琅催。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片居凶。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖藤抡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抹估,我是刑警寧澤缠黍,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站药蜻,受9級特大地震影響瓷式,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜语泽,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一贸典、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踱卵,春花似錦廊驼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至西饵,卻和暖如春酝掩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眷柔。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工期虾, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驯嘱。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓镶苞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宙拉。 傳聞我的和親對象是個殘疾皇子宾尚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容