Java 访问JAR资源

Java 访问JAR资源,java,jar,resources,embedded-resource,relative-path,Java,Jar,Resources,Embedded Resource,Relative Path,我有一个jar文件,其中包含我想要分发的资源(主要是缓存、日志等的配置) 我对这些资源的相对路径有一个问题,所以我做了我在另一个stackoverflow问题中发现的,这是一个有效的方法: ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 遗憾的是,这不起作用 有什么想法吗?谢谢 PS:显然我不能使用绝对值 路径,我想避免 环境变量(如果可能) 为了使这项工作顺利进行,我总是要费尽周折。如

我有一个
jar
文件,其中包含我想要分发的资源(主要是缓存、日志等的配置)

我对这些资源的相对路径有一个问题,所以我做了我在另一个stackoverflow问题中发现的,这是一个有效的方法:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml');
遗憾的是,这不起作用

有什么想法吗?谢谢

PS:显然我不能使用绝对值 路径,我想避免 环境变量(如果可能)


为了使这项工作顺利进行,我总是要费尽周折。如果“resource.xml”位于
org/pablo/opus
中,我想您需要这样:

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

resource.xml在哪里找到?如果在源目录树的根目录中,请尝试在其前面加上/

前缀。我通常存储文件和其他资源,然后将它们作为URL检索:

URL url = MyClass.class.getResource("/design/someResource.png");
在静态上下文中,或以其他方式:

URL url = getClass().getResource("/design/someResource.png");
从一个实例


上面的代码片段假定design是jar中的顶级文件夹。通常,如果路径以“/”开头,它将采用绝对路径,否则它将与类位置相对。

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

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

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

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

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

资源文件是否与类文件位于同一文件夹中?这是一个独立的应用程序还是在web服务器上运行?它确实在同一个文件夹中。它是一个包含在web应用程序中的jar,是的(但我认为这应该是无关的),它是相关的,搜索与给定类关联的资源的规则是由定义类加载器实现的。因此,您的web应用程序的类加载器的行为可能会因实现的不同而略有不同。只是一个想法。它不在源代码树的根上。它在一个包中。为了将完全限定名视为一个绝对路径,例如com.me.and.u.effects.css将作为/com/me/和/u/effects.css访问。事实上,我使用了您描述的(jar)绝对路径方法,它成功了!不知道为什么它没有用相对的一个做这个把戏。。。但足够好就是足够好