Java jar中的类路径资源

Java jar中的类路径资源,java,jar,classpath,resources,Java,Jar,Classpath,Resources,我有一个项目a,它包含一些java文件和一个类路径资源R.txt。在项目中,我使用ClassLoader.getSystemResource(“R.txt”);检索R.txt 然后我有一个项目B,其中包括项目a的jar文件。现在getSystemResource(“R.txt”)找不到文本文件(是的,它仍然在jar文件的根目录中)。即使尝试在其他网站上建议的“/R.txt”也不起作用。有什么想法吗 使用getResource而不是getSystemResource来使用特定于给定类加载器的资源,

我有一个项目a,它包含一些java文件和一个类路径资源R.txt。在项目中,我使用ClassLoader.getSystemResource(“R.txt”);检索R.txt


然后我有一个项目B,其中包括项目a的jar文件。现在getSystemResource(“R.txt”)找不到文本文件(是的,它仍然在jar文件的根目录中)。即使尝试在其他网站上建议的“/R.txt”也不起作用。有什么想法吗

使用
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
总是绝对的。

显然你的JAR不是由系统ClassLoader加载的,所以
getSystemResource()
不能工作。这应该起作用:

ClassFromProjectA.class.getClassLoader().getResource("R.txt")
IMO更方便的方法是将资源与使用它们的类放在同一个包中,这样您就可以使用更短的资源

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

(或者,在该类中,
getClass().getResource(“R.txt”)

是否有效?目前,您只需指定要使用的系统类加载器。

。这完全解决了我的问题。感谢您的超高速输入//JohanOne还有一个更相关的问题:我们可以从这个URL资源中获取InputStream,但是我们如何从返回的URL对象创建文件对象呢。我试图用“URLObject.toURI()”创建一个URI对象,并使用这个URI对象创建一个文件,不幸的是,它抛出了一个“URI不是层次异常”。你能给我一些帮助吗?非常感谢。@EnsomHodder:嗯,不确定-但不是所有的资源都是文件-特别是,如果它在jar文件中就不会了。谢谢你解释什么时候需要
/
。@Jeff:我回滚了编辑,因为
Class.ClassLoader
不是类名。该方法位于
ClassLoader
类中。是的,您经常调用
Class.getClassLoader()
来获取类加载器,但是调用仍然是
classloader.getResource
…非常有效。只需使用正确的类加载器:)