当我们将程序写好,并进行打包成Jar文件时,通常都带有各种资源,这些资源可以是图像或者声音文件,也可以是别的如文本文件或二进制文件等,这些资源都和代码密切相关。例如在一个JPanel类上显示一些可能变化的信息,通常都是讲这些信息先写在文本文件上,而不是硬写入JPanel中,因为信息可能会变。而这文本文件就是这个程序的资源。

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

  1. 针对图像和影音的,使用包含这代码的类调用getResource(......)方法,然后利用getImage或者getAudioClip方法进行读取。例如TextPanel.class.getResource(......)或者this.getClass().getResource(.......)
  2. 针对其他文件类型的,使用包含该文件代码的类调用getResourceAsStream(......)方法,使用过程类似上一条示例。

不管是getResource(......)方法还是getResourceAsStream(......)方法,这里的“.......”是指资源位置的地方,这个是整个使用过程中最容易出错的地方。

那么这两种方法的资源路径该如何写呢?

 修改:以下所有内容为资源没有放入Jar包中时的情况,如果将资源同代码一起打包进Jar包中,请看 《关于在打包Jar文件时遇到的资源路径问题(二)》

正如我在 《关于在打包Jar文件时遇到的资源路径问题(二)》中最后总结的,这些方法都必须根据实际情况进行选择:

如果是资源需要经常修改,那么就可以使用本文所介绍的方法,将可执行Jar包和资源分离,这样易于改动,而不需要将Jar包解压修改后在复原;

如果是某些资源不需要修改,那么就可以使用《关于在打包Jar文件时遇到的资源路径问题(二)》中的方式,将资源和字节码文件一起打包进Jar包中,这样易于将应用程序移动,

当然,如果结合这两者方式,对固定资源和常修改资源进行分类处理,能获得更好的效果。

==============================正文开始====================================================

(1). 当在项目中有使用自定义包的情况下,一定要使用绝对资源位置(位置最前面要加“/”):

  1.1  当在Eclipse调试过程中,即还未打包成Jar文件之前的运行时:

  需要认识到getResource方法和getResourceAsStream的默认根目录都是当前Project项目的二进制bin文件夹中,也就是说我往“.......”写入的路径都是从XXX(Project)/bin文件夹开始的。

  例如:

  我的一个程序ImageViewer在包fjdingsd.com.cnblogs中,而这个包在E:\Java_Program\GUIproject\bin文件夹中,所以我写的路径应该为:/XXX(资源名)

  有如下代码:

 URL picUrl = this.getClass().getResource("/palette.gif");
Image image = new ImageIcon(picUrl).getImage();

这个资源文件的放置应该如下图所示:

(请忽略那个com文件夹)

  这里将palette.gif图片放到了GUIproject项目下的bin文件夹中,正如代码所示,/palette.gif地址就是以项目下的bin文件夹开始,当然我们也可以将该资源放到这个文件夹下的子目录中,例如创建一个pictures文件夹,将palette.gif放入,那么代码就该修改为:

 chooser.setAccessory(new PreImageViewer(chooser));
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). 当该项目没有建立包时,也就是使用默认包(缺省值)时,不一定使用绝对资源位置:

(图:建立项目默认包情况)

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文件时遇到的资源路径问题(一)的更多相关文章

  1. 关于在打包Jar文件时遇到的资源路径问题(二)

    在关于<关于在打包Jar文件时遇到的资源路径问题(一)>中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将<Java核心技术卷一>中的程序1 ...

  2. Intellij打包jar文件,“java.lang.SecurityException: Invalid signature file digest for Manifest main attrib

    下面是使用Intellij 打包jar文件的步骤,之后会有运行jar文件时遇到的错误. 打包完成. ================================================== ...

  3. 打包.a 文件时, build phases- Link Binary With Libraries

    打包.a 文件时, 如果是两个Targets那么可运行调试的  build phases-  Link Binary With Libraries  如果加入.a 文件. 那么就不需要在Compile ...

  4. Eclipse将android项目打包jar文件

    Eclipse+android打包jar文件 蔡建良 2016-3-12 以Android-SlideExpandableListView开源框架为例,将源码Library打包成jar文件并包含R.c ...

  5. AndroidStduio3.0 使用gradle将module打包jar文件

    AndroidStduio3.0使用gradle将module打包jar文件,首先需要安装gradle. 打开控制台输入      open -e .bash_profile     命令,就可以打开 ...

  6. vue打包dist文件时,图片找不到

    1.vue打包dist文件时,图片找不到,无法像在本地一样查看 问题描述: 本地代码:<div class="icon"><img :src="'../ ...

  7. include文件时尽量使用绝对路径

    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row['id'] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用ech ...

  8. Maven打包成Jar文件时依赖包的问题

    我们项目中使用到第三方的库文件,这些jar库文件并没有放到Maven中央库上,导致我们需要在项目中自己配置使用.我们的两三个开发人员对Java都是很熟,因此在使用中遇到了一些问题,表现在:在本地中引入 ...

  9. java普通项目打包成可执行jar文件时如何添加第三包

    在java的web项目中,引用第三方包的时候非常简单.因为在web项目上中,默认有一个web-inf文件夹.web-inf文件夹下有一个lib文件夹,如果有用到第三方包,直接丢进去就行了.但是对于普通 ...

随机推荐

  1. System.DateUtils 3. IsPM、IsAM 判断是否为上、下午

    编译版本:Delphi XE7 function IsPM(const AValue: TDateTime): Boolean; inline;function IsAM(const AValue: ...

  2. xcode安装app

    安装 xcode 安装 xcode command line tool 检查是否安装 在终端中运行: xcrun simctl list 如果出现所有的 Device Types,则可以进行第3步 如 ...

  3. 栈的实现(JAVA)

    栈定义 栈(stack):是一种特殊的串行形式的数据结构,其特殊之处在于只允许在链接串行或者阵列的 一端进行插入.删除操作.其实现方式可以通过一维阵列和链接串行来实现. Tips:简单的来说栈其实也是 ...

  4. jQuery Ajax 实例 ($.ajax、$.post、$.get)【转载】

    本文转载自:http://jun1986.iteye.com/blog/1399242 Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的 ...

  5. jquery1.9学习笔记 之选择器(基本元素五)

    多种元素选择器  jQuery("selector1,selector2,selectorN") 例子: <!doctype html> <html lang=' ...

  6. 基础总结篇之二:Activity的四种launchMode

    合抱之木,生於毫末:九層之台,起於累土:千里之行,始於足下.<老子> 今天在社区看到有朋友问“如何在半年内成为顶级架构师”,有网友道“关灯睡觉,不用半年的...”,的确,做梦还来的快一些. ...

  7. 使用 Async 和 Await 的异步编程 #Reprinted#

    异步方法容易编写 string urlContents = await client.GetStringAsync(); 以下特征总结了使上面一个异步方法. 方法签名包含一个 Async 或async ...

  8. AD用户属性:UserPrincipalName与SamAccountName的差别

    在我们日常工作中或者日常针对AD进行自动化开发的过程中,我们都会对UserPrincipalName与SamAccountName产生疑惑,毕竟很多时候大家都把这两个属性值理解为同一个概念,至于为什么 ...

  9. MAC OS 更新GIT版本时遇到的问题

    在更新git版本时,没有备份就删掉了原先的版本,在安装完2.18.0的新版本后,使用命令行git --version,返回错误git not a developer tool or in PATH. ...

  10. Spring/Spring MVC/Spring Boot的区别

    1.spring boot更简单,容易上手: 2.spring boot对第三方技术进行了很好的封装,提供了大量的第三方接口: 3.通过依赖配置,不需要XML等配置文件: 4.提供了安全性等特性. S ...