打包jar文件的资源路径问题

转载 2016年08月25日 09:02:53

获得资源的位置有两种方式:

  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包------->



Java或者JAR包获取读取资源文件的路径的问题总结

这里分为具体两种:  第一种:资源文件为一般后缀文件  第二种:资源文件为图片文件  【NO1】第一种    使用这行代码可以获取class类的根目录的路径    String path =...
  • jdsjlzx
  • jdsjlzx
  • 2013年11月23日 22:45
  • 26133

java jar 配置文件的相对路径问题

命令行运行jar包,如何使用与jar包在同一个目录的配置文件。 其实就是当前的工作目录问题。 在eclipse中:String resource = "conf.xml";//此时文件是在src目...
  • u010902721
  • u010902721
  • 2016年05月05日 14:34
  • 4994

jar包读取file的时候相对和绝对路径的问题

我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看...
  • t69daj
  • t69daj
  • 2011年10月27日 15:10
  • 1522

eclipse中java工程打包成jar无法找到src资源文件路径的解决办法

eclipse中java工程打包成jar无法找到src资源文件路径的解决办法 在使用eclipse编写的java程序中带有src目录,在程序中访问目录下的文件需要加上相对路径src/xxxx.txt,...
  • chao_8023
  • chao_8023
  • 2017年03月06日 21:51
  • 919

java中jar包内的类访问jar包内部的资源文件的路径问题

在本地项目中,若我们要访问项目中的资源文件,则一般使用相对路径或者用System.getProperities("user.dir")得到项目根目录,然后再访问资源文件,但是在将该工程和资源文件打包为...
  • mm_bit
  • mm_bit
  • 2015年12月21日 16:37
  • 13918

Java或者JAR包获取读取资源文件的路径的问题总结

这里分为具体两种:  第一种:资源文件为一般后缀文件  第二种:资源文件为图片文件  【NO1】第一种    使用这行代码可以获取class类的根目录的路径    String path =...
  • jdsjlzx
  • jdsjlzx
  • 2013年11月23日 22:45
  • 26133

Spring-boot 微服务jar包方式启动,获取jar内资源文件到本地磁盘

在需要将微服务jar文件中的资源文件写到本地磁盘目录过程中遇到问题 根据 “classpath:xx/xx.xxx”这种方式获取资源文件,但是因为在jar包中,所有 “classpath:”...
  • zhangjian15
  • zhangjian15
  • 2017年06月15日 11:50
  • 4821

Android将Activity 打 jar包 (解决资源文件不能打包的问题)

转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来...
  • q610098308
  • q610098308
  • 2016年04月28日 17:35
  • 270

Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来替换里面的资源图片,文字等一些资源文件问题,我本来想这个简单,用两个工程直接替换里面的资源文件就行,老大说,这样子不好,...
  • feitianlian
  • feitianlian
  • 2015年12月03日 14:19
  • 209

Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

原地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其...
  • zhongguodaduan
  • zhongguodaduan
  • 2013年10月22日 18:40
  • 553
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:打包jar文件的资源路径问题
举报原因:
原因补充:

(最多只允许输入30个字)