在jar包中的类路径资源

23

我有一个名为A的项目,其中包含一些Java文件和一个classpath资源R.txt。在该项目中,我使用ClassLoader.getSystemResource("R.txt");来检索R.txt。

然后我有一个名为B的项目,它包括项目A的jar文件。现在getSystemResource("R.txt")将无法找到文本文件(是的,它仍然位于jar文件的根目录中)。甚至尝试"/R.txt",如其他网站所建议的那样也不起作用。有什么想法吗?

3个回答

52

使用getResource而不是getSystemResource来使用特定于给定类加载器的资源,而不是系统。例如,请尝试以下任何一种:

URL resource = getClass().getClassLoader().getResource("R.txt");
URL resource = Foo.class.getClassLoader().getResource("R.txt");
URL resource = getClass().getResource("/R.txt");
URL resource = Foo.class.getResource("/R.txt");

注意,在调用Class.getResource时,要添加前导斜杠,而不是ClassLoader.getResource。除非您有前导斜杠,否则Class.getResource是相对于包含类的包的路径,而ClassLoader.getResource始终为绝对路径。


太棒了。这完全解决了我的问题。感谢您的超快输入。// Johan - Johan Sjöberg
还有一个相关的问题:我们可以从这个URL资源中获取InputStream,但是如何从返回的URL对象创建一个File对象呢?我尝试使用"URLObject.toURI()"创建一个URI对象,并使用此URI对象创建文件,但不幸的是,它抛出了一个"URI is not hierarchical exception"异常。你能给我一些帮助吗?非常感谢。 - Ensom Hodder
2
@EnsomHodder:不太确定 - 但并不是所有的资源都是文件 - 特别是如果它在一个jar文件中,它就不是一个文件。 - Jon Skeet
感谢您解释了何时需要使用 / - asgs
@Jeff:我已经回滚了编辑,因为Class.ClassLoader不是一个类名。该方法在ClassLoader类中。是的,你经常调用Class.getClassLoader()来获取类加载器,但调用仍然是ClassLoader.getResource... - Jon Skeet

5

显然您的JAR文件未被系统类加载器加载,因此getSystemResource()无法工作。以下代码应该可行:

ClassFromProjectA.class.getClassLoader().getResource("R.txt")

在我看来,把资源放在和使用它们的类相同的包中更加方便,这样你就可以使用更短的路径。

ClassFromProjectA.class.getResource("R.txt")

(或者,在那个类中只需使用 getClass().getResource("R.txt")


2

运行得非常好。只需要使用正确的类加载器 :) - Johan Sjöberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接