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

在关于《关于在打包Jar文件时遇到的资源路径问题(一)》中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将《Java核心技术卷一》中的程序10-1即ResourceTest的Jar文件放在任何地方都可以执行呢?

图:将原本一起放入目录中的Jar放到桌面上,点击依然能执行

于是我将这个Jar包进行解压,发现在这个包中依然有资源,这就说明了这个包在脱离了原先目录而执行时,依据的资源路径应该是在自己的Jar包中。(至于这个Jar在原先目录时是根据自己包中的资源还是目录中的资源我并不清楚,因为按照在关于在打包Jar文件时遇到的资源路径问题(一)所描述的,在同一目录下的资源能作为URL传递进去也是可以解释的)

   解压之后:------>     

接下来的问题就是如何在打包的时候将资源也一同打包进Jar包中

方法(一) : 在cmd中使用 jar cvf *.class *.gif 或者后面再接别的资源类型的通配符格式,然后再使用 java -jar XXX.jar 。

方法(二) : 使用Eclipse方式如何操作呢:

    方法:将资源或者包含资源的文件目录放入项目文件夹中的某个文件夹,这里又有两种方式可以放置:

首先注意一点:打包时只有在项目文件下的src文件夹中才能打包进Jar包中,其他地方即使在该项目下也不能被打包进Jar包中

其次,每次新放置了资源后要对Eclipse的项目资源管理器进行刷新,这样才能正确打包

最后,以下两种方法都是在Eclipse编译时会报错,但是打包出来运行时就可以了,这就是本文同上一篇《关于在打包Jar文件时遇到的资源路径问题(一)》最大的不同之处。

================================正文开始分割线=================================================

方式一:放在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包------->

=================================================================================================================

因此可以使用这两种方式将资源进行同代码一起打包进Jar包,这两种方式并没有说哪个好哪个坏,从资源所在的位置就能看出,因此还是具体情况具体分析。

  同理,无论是这一篇博客还是上一篇的《关于在打包Jar文件时遇到的资源路径问题(一)》,这些方法都必须根据实际情况进行选择:

如果是资源需要经常修改,那么就可以使用《关于在打包Jar文件时遇到的资源路径问题(一)》所介绍的方法,将可执行Jar包和资源分离,这样易于改动,而不需要将Jar包解压修改后在复原;

如果是某些资源不需要修改,那么就可以使用本文中的方式,将资源和字节码文件一起打包进Jar包中,这样易于将应用程序移动,

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

时间: 2024-10-24 20:42:04

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

Eclipse将android项目打包jar文件

Eclipse+android打包jar文件 蔡建良 2016-3-12 以Android-SlideExpandableListView开源框架为例,将源码Library打包成jar文件并包含R.class. 开发环境: 1) Eclipse IDE for Java Developers Version: Mars.2 Release (4.5.2) 2) Android插件: ADT-23.0.4 将源码导入: 设置项目为Library: 将项目导出为jar文件: 将生成的main.jar

运行jar文件时,出现“could not find the main class”的解决方法

想要在电脑上正常运行jar文件,应该确认电脑已安装好jdk和jre,并配置好环境变量. 如果安装与配置都没有问题却无法运行,则有可能是注册表的问题. 解决方法: 打开注册表,注册表项的路径为:\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command 在此路径下有一默认键值, 不正常的情况下, 键值是:"C:\Program Files\Java\jre6\bin\javaw.exe" "%1" 在键值中添

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

我们项目中使用到第三方的库文件,这些jar库文件并没有放到Maven中央库上,导致我们需要在项目中自己配置使用.我们的两三个开发人员对Java都是很熟,因此在使用中遇到了一些问题,表现在:在本地中引入第三方jar包后,在Idea中进行相应设置后,可以调试运行了,但是用Docker打包上传到服务器后,运行时会提示找不到某些类的定义. 经查看这些找不到的类就是来自第三方库,那么问题有可能是第三方jar包的路径问题,或者是根本就没有打包进jar文件里面.我们可以去Docker容器内部查看jar文件,执

eclipse打包jar文件(含外部jar包)的方法

在项目发布前,使用eclipse导出普通的jar包时,如果配置不好,在运行命令Java -jar /test.jar 时可能会出现如下三类错误信息: 1.no main manifest attribute, in /test1jar 没有指定main方法: 2.Error: Could not find or load main class 没有指定main方法: 3.Exception in thread "main" java.lang.NoClassDefFoundError:

myeclipse打包jar文件

如果我们的计算机中安装了jre运行程序,我们就可以把我们的java程序打包成一个jar直接运行,这里我们介绍一下如何使用myeclipse来打包jar包 在myeclipse中建立一个java project,名字为javademo 在src建立demo1包,在该包中建立一个test.java程序,该程序输出hello world,然后保存. 右击项目名称,选择export 选择jar file,next 选择文件,路径,next next 选择main class,就是主函数在哪个类中.如果这

springboot打包jar文件注册成windows service

首先,准备好maven打包好的springboot的jar文件 1.先从git上(https://github.com/kohsuke/winsw/releases)下载图中标出的文件 2. 新建一个xml文件,配置服务注册信息,写入以下内容: <?xml version="1.0" encoding="UTF-8"?> <service> <!--服务ID--> <id>Unique windows service

java 打包jar文件以在没有安装JDK或JRE的机子上运行

前言: java号称“一次编译,到处运行”,但这有个前提,那就是你的机子上得安装java环境.对于开发人员或其他一些比较懂计算机的人来说这没什么,但是对于一些不懂计算机的人来说这会很麻烦,他们更希望的是东西拿来就能用,而不用另外安装其他软件.我们可以通过把jre和导出的jar文件封装在一起来实现这个效果. 方法其实很简单,就是配置好第三方库路径,再用自己的JRE里的javaw -jar xxx.jar 命令运行jar文件.详情如下: 1.把工程导出为jar文件,可借助Eclipse完成.本例为E

exe4J打包jar文件成exe可执行文件

exe4j_6.0下载(x86\x64\注册机):        https://pan.baidu.com/s/1oFzif5ZVswbgbBkKHc8HFQ 打包步骤: 再次偷一下懒,使用别人的内容,原文:https://blog.csdn.net/qq_20473985/article/details/53186216 1.打开安装好的exe4j软件,首先是一个欢迎界面,直接[next]  2.选择[JAR in EXE mode],然后[next]:  3.需要输入程序的缩写名字和指明输

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

开始使用如下代码进行打包 <build> <!-- mvn assembly:assembly -Dmaven.test.skip=true --> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> <configuration> <appendAsse