打包jar文件的資源路徑問題

獲得資源的位置有兩種方式:

  1. 針對圖像和影音的,使用包含這代碼的類調用getResource(......)方法,然後利用getImage或者getAudioClip方法進行讀取。例如TextPanel.class.getResource(......)或者this.getClass().getResource(.......)
  2. 針對其他文件類型的,使用包含該文件代碼的類調用getResourceAsStream(......)方法,使用過程類似上一條示例。

不管是getResource(......)方法還是getResourceAsStream(......)方法,這裏的“.......”是指資源位置的地方,這個是整個使用過程中最容易出錯的地方。

-------------------------------------------------------------------------------------------------------------------

(1). 當在項目中有使用自定義包的情況下,一定要使用絕對資源位置(位置最前面要加“/”):

  1.1  當在Eclipse調試過程中,即還未打包成Jar文件之前的運行時:

  需要認識到getResource方法和getResourceAsStream的默認根目錄都是當前Project項目的二進制bin文件夾中,也就是說我往“.......”寫入的路徑都是從XXX(Project)/bin文件夾開始的。

  例如:

  我的一個程序ImageViewer在包fjdingsd.com.cnblogs中,而這個包在E:\Java_Program\GUIproject\bin文件夾中,所以我寫的路徑應該爲:/XXX(資源名)

  有如下代碼:

1 URL picUrl = this.getClass().getResource("/palette.gif");
2 Image image = new ImageIcon(picUrl).getImage();

這個資源文件的放置應該如下圖所示:

(請忽略那個com文件夾)

 

  這裏將palette.gif圖片放到了GUIproject項目下的bin文件夾中,正如代碼所示,/palette.gif地址就是以項目下的bin文件夾開始,當然我們也可以將該資源放到這個文件夾下的子目錄中,例如創建一個pictures文件夾,將palette.gif放入,那麼代碼就該修改爲:

1 chooser.setAccessory(new PreImageViewer(chooser));
2 URL picUrl = this.getClass().getResource("/pictures/palette.gif");

  對應的文件放置:

 

這裏請注意:

  填寫資源位置時應該使用“/”作爲分隔符,而不要理睬系統實際使用的哪種目錄分隔符,在Windows系統中,資源加載器會自動將 “/” 裝換成“\” 。

另外在在Eclipse調試運行過程中,必須以“/”作爲最開頭,這也稱作絕對資源位置,如果不以“/”作爲開頭,那麼程序運行就會出錯:

其實也很好理解,就是默認的地址XXX(Project)/bin文件夾的結尾沒有“/”,所以我們要加入“/”,這樣最終路徑才能是XXX(Project)/bin文件夾 /pictures/palette.gif。


1.2  當程序打包成可執行Jar包時:

  這個時候資源就不是放XXX(Project)/bin文件夾下了,而是根據Jar包的位置來作爲根目錄:

  例如代碼中寫着:

URL picUrl = this.getClass().getResource("/palette.gif");
Image image = new ImageIcon(picUrl).getImage();

那麼palette.gif就該與Jar包同一個目錄下,而Jar包可以在任何目錄中:

這樣點開程序就能運行了,如果資源路徑前沒有加“/”,則無論怎麼點Jar包都不會有反應。

 

同理,如果代碼是這麼寫着:

chooser.setAccessory(new PreImageViewer(chooser));
URL picUrl = this.getClass().getResource("/pictures/palette.gif");

那麼就可以在Jar包所在目錄下建立子目錄來放置資源文件,資源文件就該放入相應子目錄中:

          

最後getResourceAsStream的資源路徑也是一樣的。

-----------------------------------------------------------------------------------------------------------------

2.1 當在Eclipse調試過程中,即還未打包成Jar文件之前的運行時:

  此時無論是getResource方法還是getResourceAsStream方法,資源位置可以是絕對資源位置,也可以是相對資源位置(最前面不加“/”):

chooser.setAccessory(new PreImageViewer(chooser));
URL picUrl = this.getClass().getResource("palette.gif");

亦或:

chooser.setAccessory(new PreImageViewer(chooser));
URL picUrl = this.getClass().getResource("/palette.gif");

都是可以的。

  注意:但是palette.gif依然必須放在從XXX(Project)/bin文件夾中,也就是類文件class所在的目錄中。


2.2  當程序打包成可執行Jar包時:

  資源位置代碼的編寫同2.1中描述的一樣,無論是使用絕對資源位置還是相對資源位置,都是可以的。

  而當打包成可執行Jar包時,資源在文件中的放置如1.2中的方法完全相同。

-----------------------------------------------------------------------------------------------------------------

如何在打包的時候將資源也一同打包進Jar包中

方法(一) : 在cmd中使用 jar cvf *.class *.gif 或者後面再接別的資源類型的通配符格式,然後再使用 java -jar XXX.jar 。

方法(二) : 使用Eclipse方式如何操作呢:

    方法:將資源或者包含資源的文件目錄放入項目文件夾中的某個文件夾,這裏又有兩種方式可以放置:

首先注意一點:打包時只有在項目文件下的src文件夾中才能打包進Jar包中,其他地方即使在該項目下也不能被打包進Jar包中

其次,每次新放置了資源後要對Eclipse的項目資源管理器進行刷新,這樣才能正確打包

最後以下兩種方法都是在Eclipse編譯時會報錯,但是打包出來運行時就可以了

-----------------------------------------------------------------------------------------------------------------

方式一:放在src文件下,就是同其他任何包在src目錄下,這種方式需要使用絕對資源位置(最前面加“/”):

  例如在ImageViewerProject項目中,將palette.gif放在src目錄下,同在這個目錄下的還有image包,該包中就是主程序

圖:將palette.gif放在src目錄下

 

圖:在Eclipse中的項目資源管理器空白處進行刷新

 

圖:刷新之後將會看到palette.gif資源將會出現在src目錄下

程序一定要使用絕對資源路徑:

chooser.setAccessory(new PreImageViewer(chooser));
URL picUrl = this.getClass().getResource("/palette.gif");

 

這時將該程序導出成Jar包,無需再添加資源到該Jar包所在目錄,就可以直接運行了:

將這個Jar包進行解壓,可以看到palette.gif就在其中,而且同image包處於同一目錄下:

 

但是還是離《Java核心技術》所示的例子還差一步,因爲其示例代碼所用的是相對資源路徑,那麼該如何做到呢,答案就在方式二。

 

=========================================================================

方式二:將資源放入程序所在的包中,此時還未打包前該包中還是各種.java文件:

例如在ImageViewerProject項目中,將palette.gif放在src目錄下的image包中,該包中就是主程序,也就是說資源和源代碼放在了一起:

圖:將palette.gif放在源碼包目錄下,和源程序放在了一起

對Eclipse進行刷新:

這樣,在程序中就可以不一定使用絕對資源路徑,可以使用相對資源路徑,代碼就可以變成這樣:

chooser.setAccessory(new PreImageViewer(chooser));
URL picUrl = this.getClass().getResource("palette.gif");

 

 

現在利用Eclipse對程序進行打包,同樣的,無需無需再添加資源到該Jar包所在目錄,就可以直接運行了:

依然對這個Jar進行解壓來看看內部,與方式一不同,這次資源就在解壓的目錄下,而是在class文件所在的包中,和字節碼文件在一起:

  打開image包------->



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章