JAVA问题解决——Jar包中资源调用

我在打包工程的时候,遇到在IDE中能够运行但jar包运行错误的情况(FileNotFoundException)。

在网上找的很多解决方法都是需要使用getResouce方法获取绝对路径,或者必须先把文件读入才能继续操作。

使用getRescource仍然有上述错误;而要读取的文件是一个需要和前端交互,要在文件上进行操作的文件,必须保证文件原格式不变。所以读入再操作的方法并不适合,因为再输出时格式控制等会十分麻烦。

下面是一些解决问题中学习到的内容:

i.

jar包是一个文件,我的理解是,jar包内部有一个自己的文件系统(它会在文件特定路径上加一个!,即会出现*!/*这样的形式),而在jar包内使用相对或绝对路径其实调用的都是机器上的FileSystem,路径和jar包中的不匹配,因此想要以这个路径在jar包中获取文件是不可行的。

(这让我产生了另一个疑问,那网上的getResource()方法传入的路径是怎么解析的)

疑问解答:

如果只是路径,jar包是可以获取的,而且还是绝对路径(/static/config.xml),jar包内部是可以获取到的(虽然不知道为什么),但是如果要调用

Resource resource = new ClassPathResource(path);
File file = resource.getFile();

这个时候是不可以的。

我认为是因为调用了File,是机器上的文件系统,而files输出也是file:/C:/****的路径,和jar包内路径是不符合的,因此jar包无法通过file来找到文件。

ii.

这次之所以要使用文件路径,是因为调用了一个DocumentBuidler.parse()方法,一开始是传入了一个File类型的参数,而新建File又使用了路径,问题迟迟不能解决就查看了源代码,发现parse方法可以重载:

// 下面是4个重载的parse函数
public Document parse(InputStream is){...}

public Document parse(InputStream is,String SystemId){...}

public Document parse(String uri){...}

public Document parse(File f) throws SAXException, IOException{...}

然后!就发现可以直接传URI!就用了下面的方法:

/**
* doc 是Document的实例
* db是DocumentBuilder实例
* path是资源文件的绝对路径
*/
doc = db.parse(this.getClass().getResource(path).toString());

然后就成了!!

时间: 2024-08-29 19:57:26

JAVA问题解决——Jar包中资源调用的相关文章

(转)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 从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 包中的 main 方法

通过 OneJar 或 Maven 打包后 jar 文件,用命令:java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多个 main 方法,那么如何运行指定的 main 方法呢?用下面的命令试试看: java -classpath ****.jar ****.****.className [args] “****.****”表示“包名”:“className”表示“类名”:“[args]”表示传入的参数: 直接运行 MANIFEST.MF 中指定的 main 方法:

JAR包中的MANIFEST.MF文件详解以及编写规范

参考百度百科的解释如下: MANIFEST.MF:这个 manifest 文件定义了与扩展和包相关的数据.单词“manifest”的意思是“显示” 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内容,先来看struts.jar中包含的MANIFEST.MF文件内容: Manifest-Version: 1.0 Created-

[Java基础] 深入jar包:从jar包中读取资源文件

转载: http://hxraid.iteye.com/blog/483115?page=3#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看下面的代码: //源代码1: package edu.hxraid; import java.io.*; public class Resource { public void getRe

读取Jar包中的资源问题探究

最近在写一个可执行jar的程序,程序中包含了2个资源包,一个是images,一个是files.问题来了,在Eclipse里开发的时候,当用File类来获取files下面的文件时,没有任何问题.但是当程序导出为Runnable Jar时,运行程序时抛出异常,File not found.我们来一探究竟. 首先是我的工程目录结构: 程序中访问images下的图片代码: [java] view plaincopyprint? setIconImage(new ImageIcon(this.getCla

Java读取jar包资源文件

把java项目打包成jar包,如果jar包中存在资源文件需要访问,需要采取stream的形式访问,可以调用getResourceAsStream()方法,而不能采用路径的方式访问(文件已经被打到jar里面了,不符合路径的).使用getResourceAsStream()方法文件可以有两种方式存放: (1)文件存放在src的类路径下. (2)文件存放在资源文件夹下面,通过Build Path-Use as Source Folder来把普通文件夹变成资源文件夹. 如图,把testA打包成jar包,

利用jar -cvf *.jar * 和直接islibrary 然后生成的jar包比较(Android中jar包封装及调用)

利用jar  -cvf  *.jar * 和直接islibrary 然后生成的jar包比较 jar  -cvf  *.jar *   会打包资源 即R.java.BuildConfing.java和MainActivity.java is  library只会把包MainActivity.java 百度:(但是还是觉得没有解决我的疑惑) 在android开发过程中,我们经常会有这种需求,自己开发一个类库jar包,提供给别人调用. 即把项目A封装成jar包,供项目B调用,而在项目B中调用项目A的a

Android 中jar包封装及调用-转

在android开发过程中,我们经常会有这种需求,自己开发一个类库jar包,提供给别人调用. 即把项目A封装成jar包,供项目B调用,而在项目B中调用项目A的activity的时候问题就出现了:找不到资源文件(异常:ERROR/AndroidRuntime(3341):Caused by: android.content.res.Resources$NotFoundException: Stringresource ID #0x7f060007).问题是,只能共享src文件夹下的代码,而不能共享