访问JAR资源

问题描述:

我有一个jar文件,其中包含我想分发的资源(主要是用于缓存,日志记录等的配置)。访问JAR资源

我在使用这些资源的相对路径的问题,所以我做了什么,我在另一个计算器问题,其表示,这是一个有效的办法已经找到:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 

可悲的是这并不行。

任何想法?谢谢!

PS:很明显,我不能使用绝对路径 ,我想避免 环境变量如果可能的话

+0

资源文件与类文件位于同一文件夹中吗?这是一个独立的应用程序还是在Web服务器上运行? – kgiannakakis 2010-04-14 18:28:12

+0

确实在同一个文件夹中。它是一个包含在Web应用程序中的jar,是的(但我认为它应该是无关紧要的) – 2010-04-14 18:34:21

+2

它与搜索与给定类关联的资源的规则是由定义的类加载器实现的。因此,基于实现,您的Web应用程序的类加载器的行为可能会稍有不同。只是一个想法。 – 2010-04-14 18:38:26

确保您的资源文件夹在项目设置中列为源文件夹。另外,确保在构建jar时将资源文件夹设置为导出。

您可以向jar文件中添加一个.zip扩展名,然后将其打开,以确保您的资源包含在预期的位置。

我总是使用绝对路径是这样的:

InputStream input = this.getClass().getResourceAsStream("/image.gif"); 

当您使用绝对路径,“/”是jar文件的根文件夹,而不是主机的根文件夹。

+4

为+1注意/是jar的根文件夹。 – Powerlord 2010-04-14 18:53:57

+0

的确,我使用了你描述的(jar)绝对路径方法,它的工作原理!不知道为什么它没有与相关的技巧做到这一点......但足够好就足够了 – 2010-04-14 18:56:57

我总是通过getResourceAsStream困扰,使这项工作。如果 “resource.xml” 是org/pablo/opus,我认为你想这样的:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml"); 

其中resource.xml发现的?如果在源代码树的根目录中,尝试用/作为前缀。

+0

它不在源代码树的根目录下。它位于包 – 2010-04-14 18:41:11

+1

中,因此将完全限定的名称视为绝对路径,例如com.me.and.u.effects.css将作为/com/me/and/u/effects.css进行访问, – Seffi 2010-04-14 18:50:27

我通常存储文件和其他资源,然后检索它们作为网址:

URL url = MyClass.class.getResource("/design/someResource.png"); 

在静态情况下,或以其他方式:

URL url = getClass().getResource("/design/someResource.png"); 

从一个实例。

上面的代码片段假定设计是jar中的*文件夹。一般来说,如果路径以“/”开始,它将采用绝对路径,否则它与班级位置是相对的。