Java中的资源加载不能正常工作

这是从jar文件加载资源的众所周知的问题。 这不是我第一次尝试这样做,但现在它不像我期望的那样工作。

通常我尝试使用this.getClass.getResource("foo.png")getResourceAsStream()加载资源,它可以正常工作。 但现在却没有。 资源始终为null。

如果我让System.out.println(this.getClass.getResource(""))打印我的路径(从eclipse)它显示/path/to/eclipseproject/package/structure/ 。 从jar运行它只显示rsrc:package/structure

如果我没记错的话,应该打印jar的路径。 此外,我认为这将打印两种情况下的包结构。 难道我做错了什么?

这是事情……

从Jar中提取文件时使用:

 this.getClass.getResource("/foo.png") 

从可运行的Jar使用时,在Jar文件夹路径中引用外部文件:

 this.getClass.getResource("foo.png") // When running this from Eclipse, it would refer to files in project root! 

我在较低级别的代码确定我正在运行的位置以确定正确的路径。

这会得到你需要的道路吗?

 this.getClass().getClassLoader().getResource(".class").getPath(); 

有关此问题的更多信息,请参阅此问题。

除非使用’/’预先指定资源的路径,否则Class.getResource()将在类包中搜索资源。 例如:tld.domain.Foo.class.getResource(“Bar.txt”)将搜索tld / domain / Bar.txt

检查URLClassLoader以获取所有血腥细节,但这实际上取决于您是否尝试访问jar中的资源,

  • 使用在同一个jar中加载的类,在这种情况下,你的文件’root’是jar的根

  • 使用在jar外部加载的类(你的eclipse案例),其中root是你的’工作目录’

要从外部访问jar内的资源,你应该使用类似的东西

URL url = new URL( "jar", "", "file:" + jar.getCanonicalPath( ) + "!/" + localPathResource ); url.openStream(...)

这个答案解释了如何从JAR文件加载类资源,即使该类不在JAR文件中而不在JAR文件清单中指定的Class-Path中。 还有代码链接。