1. 程式人生 > >Eclipse匯出的jar包無法顯示圖片?

Eclipse匯出的jar包無法顯示圖片?

在用java開發桌面應用程式時(雖然現在很少有人用),如果將專案匯出成jar包而專案中包含圖片等資源時,可能會無法正確載入這些資源。這主要是因為jar包是一個單獨的檔案而非資料夾,絕對不可能通過 “file:/e:/…/ResourceJar.jar/resource/123.jpg” 這種形式的檔案URL來定位 123.jpg 。所以即使是相對路徑,也無法定位到jar檔案內的圖片資源。解決方法有如下兩種。

將圖片資源分離出來(不打包)

如果你的專案結構圖是這樣的:
123
而程式碼是這樣寫的:

package com.xiaoli.tank;

import java.awt.Graphics;
import
java.awt.Rectangle; import javax.swing.ImageIcon; public class River { int x,y; ImageIcon river = new ImageIcon("images/river.gif"); public River(int x,int y){ this.x=x; this.y=y; } public void draw(Graphics g){ g.drawImage(river.getImage(),x, y,null); } public
Rectangle getRect() { return new Rectangle(x, y,river.getIconWidth(),river.getIconHeight()); } }

那麼將專案打包後的jar檔案和images檔案放在同一目錄下即可,如圖所示:
456

整體打包

很多時候放置兩個檔案很變扭,那麼我們可以將整個專案進行打包。在專案的 src 目錄下新建 package images ,將圖片資源放入 images 包下,如下圖所示:
1
這時候對應的程式碼應該寫為:

package com.xiaoli.tank;

import
java.awt.Graphics; import java.awt.Rectangle; import javax.swing.ImageIcon; public class River { int x,y; ImageIcon river = new ImageIcon(this.getClass().getClassLoader().getResource("images/river.gif")); public River(int x,int y){ this.x=x; this.y=y; } public void draw(Graphics g){ g.drawImage(river.getImage(),x, y,null); } public Rectangle getRect() { return new Rectangle(x, y,river.getIconWidth(),river.getIconHeight()); } }
  1. ClassLoader 是類載入器的抽象類。它可以在執行時動態的獲取載入類的執行資訊。可以這樣說,當我們呼叫jar包中的 River 類時,JVM載入進 River 類,並記錄下 River 執行時資訊(包括 River 所在jar包的路徑資訊)。而 ClassLoader 類中的方法可以幫助我們動態的獲取這些資訊:
    public URL getResource(String name);
        查詢具有給定名稱的資源。資源是可以通過類程式碼以與程式碼基無關的方式訪問的一些資料(影象、聲音、文字等)。並返回資源的URL物件。
    public InputStream getResourceAsStream(String name);
         返回讀取指定資源的輸入流。這個方法很重要,可以直接獲得jar包中檔案的內容。
  2. ClassLoaderabstract 的,不可能例項化物件,更加不可能通過 ClassLoader 呼叫上面兩個方法。所以我們真正寫程式碼的時候,是通過 Class 類中的 getResource()getResourceAsStream() 方法,這兩個方法會委託 ClassLoader 中的 getResource()getResourceAsStream() 方法。

參考自:http://blog.51cto.com/cjcxd2004/1256381