我有一个名为A的项目,其中包含一些Java文件和一个classpath资源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
。除非您有前导斜杠,否则Class.getResource
是相对于包含类的包的路径,而ClassLoader.getResource
始终为绝对路径。
显然您的JAR文件未被系统类加载器加载,因此getSystemResource()
无法工作。以下代码应该可行:
ClassFromProjectA.class.getClassLoader().getResource("R.txt")
在我看来,把资源放在和使用它们的类相同的包中更加方便,这样你就可以使用更短的路径。
ClassFromProjectA.class.getResource("R.txt")
(或者,在那个类中只需使用 getClass().getResource("R.txt")
)
ClassLoader.getResource()方法是否有效?目前您只是指定要使用系统类加载器。
/
。 - asgsClass.ClassLoader
不是一个类名。该方法在ClassLoader
类中。是的,你经常调用Class.getClassLoader()
来获取类加载器,但调用仍然是ClassLoader.getResource
... - Jon Skeet