我有一个可运行的jar文件,它无法访问位于默认src目录之外的资源。根据我对What is the difference between Class.getResource() and 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复制这个,它实际上能够正确地解析路径。我已经通过(Project - > Properties - > Java Build Path - > Add Folder)将资源目录添加到构建路径中,因此Java应该能够在运行时找到资源文件夹。
在生成jar文件方面有什么我缺少的吗?在解压缩jar文件时,所有内容似乎都与img和audio目录在根目录中一致(给定上面的初始文件夹设置):
foo/
/bar
img/
img1.png
audio/
audio1.wav
答案 0 :(得分:6)
File
s只能用于表示文件系统中的实际文件。将文件打包到JAR后,资源(img/img1.png
)不再是文件,而是JAR文件中的条目。只要您在Eclipse中使用文件夹结构,资源就是单独的文件,所以一切都很好。
试试这个:
System.out.println(CLASS_LOADER.getResource(relativePath));
它将打印一个URL,但它不是文件系统中文件的有效路径,而是JAR文件中的条目。
通常,您只想阅读资源。在这种情况下,请使用getResourceAsStream()
打开InputStream
。