【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路径下,而不是直接放在工程的根目录中。

时间: 2024-08-09 23:27:00

【JAVA】在jar文件中引用图片等外部资源的问题的相关文章

Java 从Jar文件中动态加载类

由于开发的需要,需要根据配置动态加载类,所以简单测试了一下JAVA动态加载类 定义接口 package loader; public interface HelloIface {     public String hello();          public String sayHi(); } 实现接口 在其他插件类实现此接口,并导出为jar,如D:/tmp/test.jar package loader; public class HelloImpl implements HelloIf

java 从jar包中读取资源文件

在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码:Java代码 [java] view plaincopy //源代码1: package edu.hxraid; import java.io.*; public class Resource { public  void getResource() throws IOException{ File fil

(转)java 从jar包中读取资源文件

(转)java 从jar包中读取资源文件 博客分类: java 源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码:Java代码 [java] view plaincopy //源代码1: package edu.hxraid; import java

java程序替换word2007中的图片

1.新建word2007文档h2do.docx: 2.QQ截图粘贴到文档,添加些文字: 3.用winrar打开(修改扩展名docx为rar或右键->打开方式->选择winrar程序),目录结构如下: . │  [Content_Types].xml │ ├─docProps │      app.xml │      core.xml │ ├─word │  │  comments.xml │  │  document.xml │  │  endnotes.xml │  │  fontTabl

向github的README文件中添加图片

1,向README文件中添加图片,用于展示程序效果或辅助说明! 两步: 首先,向github 上传所需的图片: 然后,打开README文件,写入图片的格式为: ![image](https://github.com/secondLieutenantCoder/TableAndCollection/blob/master/resut.png?raw=true) ![image](图片的URL) 图片写入成功!

c中头文件在cpp文件中引用和.h文件引用的思考

我们在编写程序中头文件是经常使用的.但是头文件是应该包含在.H文件中还是在.cpp文件中.在这个当中有什么样去区别呢.  假如说我们编写了一个a.cpp  .我们将a.cpp文件的变量和函数申明在a.h中.在a.h文件有使用了b.中定义的类型type1数据m_type,同样b.cpp的头文件一些变量也声明在b.h中.此时我们当然可以在a.cpp中包含b.h 也可以在a.h中.这样都是可行的,因为我们编译的时候会会将b.h包含进来.而.h文件是不参与编译的.然后我们继续深入.假如我们将b.h文件定

在C的头文件中定义的结构体,如何在cpp文件中引用

解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dialog3.h" #include <QDebug> extern "C" { typedef struct PRINT { unsigned char Parameters;//BitDepthAC,BitDepthDC,q unsigned char PlaneCo

Silverlight读取Zip文件中的图片与视频

首先看看Demo的截图: 下面我将一步步展示实现这个Demo的过程,这个需求就是读出Zip文件中的图片与视频. Demo整体架构: 首先我们准备几张图片和视频,然后将其压缩至resource.zip文件中,做完之后,我们建立一个resource.xml文件记录压缩包内的资源 <?xml version="1.0" encoding="utf-8" ?> <files> <file type="video" name=

电脑中如何提取PDF文件中的图片

通常,我们在一些PDF文件中看到一些好看的图片,想将图片保存下来,但是PDF文件是无法编辑的,在文件自身当中我们无法将图片完成的提取出来,因此大家都会想办法在不破坏图片完整性的情况下将图片从PDF文件中提取出来,下面就跟大家分享一下小编是从电脑中如何提取PDF文件中的图片.借助工具:×××换器1.在PDF文件中提取图片,本身也是一种对文件的编辑,知识PDF文件无法编辑,所以我们要借助工具来进行编辑,工具可以直接在百度浏览器中下载.2.下载安装好工具,打开工具,进入到操作页面,操作页面左边是功能栏