什么是指定从类路径读取的路径的最佳方法,即使项目是jar

时间:2016-12-31 14:54:51

标签: java maven properties classloader java-io

我正在尝试使用Properties.load();在maven nature项目中读取一个Properties文件。我将路径指定为字符串ex。 "./someFolder/file.properties", 但是当我尝试将我的项目用作其他项目中的依赖项时,我被迫将这些文件复制到另一个项目,因为"."表示当前目录。 有没有办法指定路径,所以尽管我从哪里调用它,它总是有效的? , 我曾尝试使用MyClass.class.getClassLoader().getResourceAsStream(),但我在使用它时遇到了麻烦,有时会工作,有时会失败。

2 个答案:

答案 0 :(得分:1)

你的问题有很多误解。

  

“”。表示classPath

没有。在文件系统路径中使用时(即传递给File,FileReader或FileInputStream的构造函数的路径),“。”表示当前目录。

资源路径中使用时(即传递给Class[Loader].getResource[AsStream]()),它无效。

诀窍是仔细阅读文档。

getResourceAsStream()需要/分隔的路径。

使用ClassLoader.getResource[AsStream]()时,此路径始终从类路径的根开始。因此,您将传递一个看起来完全类似于完全限定类名的路径,除了点将被斜杠替换。因此,com/foo/bar.properties会在包bar.properties中查找名为com.foo的资源。

使用SomeClass.class.getResource[AsStream]()时,路径以/开头,路径从类路径的根开始,或者不是,并且从SomeClass的包开始。因此,如果SomeClass位于包com.foo中,则使用/com/foo/bar.properties相当于使用bar.properties

很难说出你做错了什么,因为你没有提供任何细节。但是你真的需要理解在文件系统上打开文件和读取类加载器加载的资源之间的区别。有时,资源恰好是由类加载器从文件系统加载的,因为类路径碰巧包含目录,而不仅仅是jar文件。

答案 1 :(得分:0)

我注意到我的问题是我在项目路径中有我的属性文件,ClassLoader.getResource[AsStream]();看起来是target/classes文件夹,而我没有资源我项目中的文件夹。

我解决了这个问题,我将resources文件夹添加到了我的构建路径,并将src/main/resources中的文件添加为src/main/resources/foo/bar.properties并将其加载SomeClass.class.getClassLoader().loadResourceAsStream("foo/bar.properties");