我有一个可运行的jar文件,但它无法访问默认src目录之外的资源。根据我从什么是Class.getResource()和ClassLoader.getResource()的区别了解到的,我应该能够通过使用以下getResourceFile函数来访问root/res/img/img1.png(请参见下面的文件夹设置):
public class Foo {
private static final ClassLoader CLASS_LOADER = Foo.class.getClassLoader();
public static File getResourceFile(String relativePath) {
// Since I'm using getClassLoader, the path will resolve starting from
// the root of the classpath and it'll take an absolute resource name
// usage: getResourceFile("img/img1.png")
// result: Exception in thread "main" java.lang.NullPointerException
return new File(CLASS_LOADER.getResource(relativePath).getFile());
}
}
文件夹设置:
root/
src/
foo/
bar/
res/
img/
img1.png
audio/
audio1.wav
当我尝试执行JAR可执行文件本身时,问题就出现了。但奇怪的是,我无法通过Eclipse IDE复制这个问题,因为Eclipse实际上可以正确解析路径。我已经通过(项目->属性->Java构建路径->添加文件夹)将资源目录添加到构建路径中,所以Java应该能够在运行时找到资源文件夹。
在生成JAR文件方面,我是否漏掉了什么?当解压缩JAR文件时,一切似乎都井然有序,img和audio目录位于根目录下(假定上述初始文件夹设置正确)。
foo/
/bar
img/
img1.png
audio/
audio1.wav
jar
文件,它就不再是一个“文件”了。如果你把它的URI放到一个File
中,文件将无法被找到,因为它不在文件系统中。你应该将其作为输入流来使用,而不是文件。 - RealSkeptic