關於jar的資源(img、music、ico等等)定位問題

很多朋友在做java項目的時候,會把項目打包成jar來發布,但是,如果項目涉及到img、music、ico等外來資源的時候,在工程下往往是可以的,能運行的,但打包成jar之後就不能運行了。這是爲什麼呢?只要您的仔細的看完本片文章,相信會對jar的資源定位方法有一個較爲全面的瞭解。本人剛學不久,講的不對的地方請各位大哥大姐一定多多拍磚。關於jar的資源(img、music、ico等等)定位問題 - 卡敵奴 - 幽藍谷

大家做java項目的時候,一般用2種方式來定位資源:相對路徑資源定位和URL資源定位

1、相對路徑資源定位

這時大家在工程底下常用的方法是:

...

jframe.setIconImage(Toolkit.getDefaultToolkit().getImage("img/1.png"));
...

systemTray = SystemTray.getSystemTray();// 獲得系統托盤的實例
try {
    icon = new ImageIcon("img/1.png").getImage();
    trayIcon = new TrayIcon(icon, "XXX");
    systemTray.add(trayIcon);// 設置托盤的圖標,img/1.png與該類文件同一目錄
} catch (AWTException e) {
}

...

工程文件結構如下:
工程文件夾/src
工程文件夾/img/1.png


這樣子,在工程狀態下是可以運行的,打包成jar後就不能運行了。
注意:以上代碼沒有問題,是正確的。

解決辦法:
在jar包同級目錄下新建“img”文件夾,將1.png放到img文件夾內,問題解決。

文件夾結構如下:
某文件夾F/xxx.jar
某文件夾F/img/1.png


但是,我們通常不希望將資源文件和jar分開放,那樣總感覺不爽,怎麼辦呢?這個時候this.getClass().getResource(String arg0)和this.getClass().getResourceAsStream(String arg0)就要發揮作用了。請看URL資源定位篇。

2、URL資源定位

this.getClass().getResource(String arg0)能定位當前jar內的資源路徑
this.getClass().getResourceAsStream(String arg0)能獲取當前jar內的資源的流,能直接讀寫操作該資源

這是,大家經常會將代碼改成如下:

...

jframe.setIconImage(Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("img/1.png")));

...

systemTray = SystemTray.getSystemTray();// 獲得系統托盤的實例
try {
    icon = new ImageIcon(this.getClass().getResource("img/1.png")).getImage();
    trayIcon = new TrayIcon(icon, "XXX");
    systemTray.add(trayIcon);// 設置托盤的圖標,img/1.png與該類文件同一目錄
} catch (AWTException e) {
}

...

但是,很多人在具體做的時候,還是經常出現無法定位的問題。
注意:以上代碼沒有問題,是正確的。

問題現象是:
this.getClass()爲null,無法獲得;
而this.getClass().getResource("img/1.png")就直接出錯
Exception in thread "main" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at com.xirui.WebSrv.Gui.<init>(Gui.java:83)
    at com.xirui.WebSrv.Gui.main(Gui.java:197)

解決辦法:
首先,確定你使用的方法支持URL參數,因爲this.getClass().getResource(String arg0)返回的是URL路徑,並非正真的文件路徑;還有就是img/1.png要和*.class文件放在同一目錄下,而不是直接放到jar內就可以了。

解決辦法的舉例說明:
你有一個工程,包爲 com.aa.bb;

工程結構應該是:
工程文件夾/bin/com/aa/bb/*.class
工程文件夾/bin/com/aa/bb/img/1.png
而不是
工程文件夾/bin/com/aa/bb/*.class
工程文件夾/img/1.png

jar包的結構:
你的工程打成jar包後,用rar打開(並非解壓)jar包後能看到
jar/com/aa/bb/*.class
使用rar的添加文件功能,將img/1.png放入bb目錄下
最後,jar文件結構如下:
jar/com/aa/bb/*.class
jar/com/aa/bb/img/1.png
而不是
jar/com/aa/bb/*.class
jar/img/1.png

這樣,資源文件1.png就在jar裏面了,無論你的jar包怎麼放,都能引用到1.png資源

總結:
相對路徑資源定位:需要將資源文件放到src文件夾或jar文件的同級目錄下
URL資源定位:需要將資源文件放到*.class的同級目錄下
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章