2019年08月19日(星期一)  农历:己亥年七月十九
  • 首页
  • JAVA
  • 在jar文件中引用图片等外部资源的问题

作者:三年。分类: JAVA

很多时候我们需要把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路径下,而不是直接放在工程的根目录中。

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/1441 人参与

发表评论:



手Q扫描加入Java初学者群