【JAVA】在jar文件中引用圖片等外部資源的問題


很多時候我們需要把java程序導出成可執行的jar包,但是往往會遇到一個問題:程序中引用的外部資源如圖片等在可執行jar包中失效。筆者自己也遇到了這個問題,查閱了網上的一些資料,寫得不太易懂,稍微研究了一下算是解決了這個問題,在這里記錄下來。

我們以一個特別簡單的程序為例,在JFrame中放置一張圖片,工程的文檔結構如下:

注意到圖片資源是存放在src下的。代碼如下:

 1 package in.love1017best;
 2 
 3 import javax.swing.*;
 4 
 5 public class JARPictureTest {
 6 
 7     public static void main(String[] args) {
 8         new JARPictureTest().go();
 9     }
10     
11     public void go() {
12         JFrame jFrame = new JFrame("JARPictureTest");
13         ImageIcon img = new ImageIcon("src/image/green.jpg");
14         JLabel label = new JLabel(img);
15         jFrame.getContentPane().add(label);
16         jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
17         jFrame.setSize(520, 693);
18         jFrame.setVisible(true);
19     }
20 
21 }

運行的結果如下:

之后在eclipse中將工程導出成可執行jar包並運行,發現圖片無法正常顯示。但是我們之前已經特意把圖片文件放在了src下,應該是被打包進了jar文件的,用WinRAR查看jar文件的文檔結構,發現確實有圖片資源文件,但是就是無法顯示:

這是因為在導出的jar包中定位圖片文件失敗的原因。

為了解決這個問題,我們需要用另外一種方式來引用資源。將go()方法改寫為如下形式:

 1 public void go() {
 2     JFrame jFrame = new JFrame("JARPictureTest");
 3     java.net.URL imgURL = JARPictureTest.class.getResource("/image/green.jpg");
 4     ImageIcon img = new ImageIcon(imgURL);
 5     JLabel label = new JLabel(img);
 6     jFrame.getContentPane().add(label);
 7     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 8     jFrame.setSize(520, 693);
 9     jFrame.setVisible(true);
10 }

我們使用了class.getResource()方法,這是獲取文件的另一種方法,而這種方法可以以編譯之后生成的Class文件為出發點來對文件進行定位,這樣就保證了在導出的jar包中也能准確定位到我們需要的資源文件。

在這里的寫法是JARPicture.class.getResource(),即在主類名稱后使用.class.getResource(),注意其參數的寫法,路徑一律使用正斜杠(/),千萬不能寫反了,而第一個斜杠則表示根目錄,由於我們生成jar包時的默認設置是只包含java工程中的src文件夾,所以這里的根目錄指的就是src目錄,在根目錄下直接查找image/green.jpg即可。注意路徑嚴格區分大小寫,包括拓展名!

由此也可以看到,我們在使用外部資源的時候,最好把這些資源都放在src路徑下,而不是直接放在工程的根目錄中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM