【问题标题】:Whats the best way to specify a path to read from class-path even if project was a jar什么是指定从类路径读取路径的最佳方法,即使项目是 jar
【发布时间】:2016-12-31 14:54:51
【问题描述】:
我正在尝试使用Properties.load(); 读取 Maven 自然项目中的属性文件,我将路径指定为字符串 ex。 "./someFolder/file.properties",
但是当我尝试在其他项目中使用我的项目作为依赖项时,我不得不将这些文件复制到其他项目,因为"." 表示当前目录。
有没有办法指定一个路径,所以不管我从哪里调用它,它总是有效的? ,
我曾尝试使用MyClass.class.getClassLoader().getResourceAsStream(),但我在使用时遇到了问题,它有时有效,有时失败。
【问题讨论】:
标签:
java
maven
properties
classloader
java-io
【解决方案1】:
你的问题有很多误解。
“。”表示类路径
没有。当在 filesystem 路径(即传递给 File、FileReader 或 FileInputStream 的构造函数的路径)中使用时,“.”表示当前目录。
在资源路径中使用时(即传递给Class[Loader].getResource[AsStream]()),它是无效的。
诀窍是仔细阅读文档。
getResourceAsStream() 需要一个 / 分隔的路径。
使用ClassLoader.getResource[AsStream]() 时,此路径始终从类路径的根开始。因此,您将传递一个看起来与完全限定类名完全相同的路径,除了点将被斜杠替换。因此,com/foo/bar.properties 在包com.foo 中查找名为bar.properties 的资源。
使用SomeClass.class.getResource[AsStream]()时,路径要么以/开头,路径从类路径的根开始,要么不,从SomeClass的包开始。因此,如果 SomeClass 在包com.foo 中,则使用/com/foo/bar.properties 等价于使用bar.properties。
很难说你做错了什么,因为你没有提供任何细节。但是您确实需要了解在文件系统上打开文件和读取由类加载器加载的资源之间的区别。有时,资源恰好是由类加载器从文件系统加载的,因为类路径恰好包含目录,而不仅仅是 jar 文件。
【解决方案2】:
我注意到我的问题是我的项目路径本身中有我的属性文件,ClassLoader.getResource[AsStream](); 看起来是target/classes 文件夹,而我的项目中没有资源文件夹。
我通过将资源文件夹添加到我的构建路径并将我的文件添加到src/main/resources 中作为以下src/main/resources/foo/bar.properties 并通过SomeClass.class.getClassLoader().loadResourceAsStream("foo/bar.properties"); 加载它解决了这个问题。