在关于《关于在打包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包中,这样易于将应用程序移动,

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

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

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

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

  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. 处理IIS报“由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面”

    “由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面” 详细错误:HTTP 错误 404.2 - Not Found. 由于 Web 服务器上的“ISAPI 和 C ...

  2. 基于Sql Server 2008的分布式数据库的实践(一)

    原文 基于Sql Server 2008的分布式数据库的实践(一) 配置Sql Server 2008(Win7) 1.打开SQL server2012,使用windows身份登录 2.登录后,右键选 ...

  3. docker学习笔记11:Dockerfile 指令 CMD介绍

    我们知道,通过docker run 创建并启动一个容器时,命令的最后可以指定容器启动后在容器内立即要执行的指令,如: docker run -i -t ubunu /bin/bash   //表示容器 ...

  4. 一个load飙高的过程分析,非常有价值(转)

    关于us高和sy高的问题分析: 当us值过高时,表示运行的应用消耗大量的CPU.java应用造成us高的原因主要是线程一直处于可运行(Runnable)状态,通常这些线程在执行无阻塞.循环.正则或纯粹 ...

  5. linux c 得到时间

    ctime: 将时间和日期以字符串格式表示头文件: time.h函数定义: char *ctime(const time_t *timep); 应用举例:#include <stdio.h> ...

  6. 基于visual Studio2013解决C语言竞赛题之0605strcat

      题目

  7. Mybatis3 框架理解

    最近工作比较闲,维护一个政府机关的短信发送平台,大部分业务逻辑都在Oracle数据库上,但自己明明应聘的是Java开发啊!!!整天写存储过程的我还是有一颗写高级语言的心啊!!!好吧!!!先找个数据库方 ...

  8. libgdx, mouse 关节

    鼠标与body的交互就靠这个mouse 关节了. 在使用中:主要分成3步: 步1:mouseDown : 这个时期,调用world->QueryAABB.它有一个回调接口,并依据鼠标指针指定一个 ...

  9. cocos2d-x中文显示:加字库

    1.如下:为了中文显示 2.如下:解决方案-加入中文字库

  10. 1 #安装php

    #安装php #备注:php5..3以后的版本源码不需要打php-fpm补丁,该补丁已经集成进5..3中强制启用fastcgi. [root@dba01 nginx-]# cd [root@dba01 ...