我有一个Java项目并使用标准的maven原型来创建dir结构。 它看起来像这样:
|-src/main/java
|-src/main/resources
|-target/classes
|- ...
现在,我的一个类使用.properties文件来读取某些设置。我将它放在src / main / resources中并通过File propertiesFile = new File("./src/main/resources/starter.properties");
读取
当我使用eclipse运行配置时,一切正常。但是最近我尝试使用java some.package.Class
从我的控制台启动相同的Java类,并且因为.class文件位于目标/类中,所以我得到了消息,即./src/main/resources/starter。无法找到属性。
我究竟做错了什么? .properties文件不应该位于resources-folder中,还是我必须使用其他方式加载它?
答案 0 :(得分:5)
之前的两个答案是正确的,但我想提供更多的背景。
此文件位于两个位置。它从/ src / main / resources开始,当你构建项目时,Maven将它复制到/ target / classes。
在运行时,您不应访问源代码中的副本。否则,您的软件需要访问源代码才能运行。相反,您应该访问交付物中的副本。在执行时,您可以安全地假设您将在类路径中找到它。它与编译的类位于同一个位置,因此如果它不在类路径中,那么您将无法首先运行该程序。这就是为什么你应该使用其他回答者提到的getResourceAsStream()
。
(虽然对于制作软件,我建议使用Spring的资源抽象来访问这些东西。)
答案 1 :(得分:4)
使用
YourClass.class.getResourceAsStream("/filename.properties");
答案 2 :(得分:3)
为了扩展已经给出的两个答案,在构建Maven项目时,src / main / resources中的文件将被复制到类路径根目录的JAR中。如果你做了jar tvf *yourjarname*
,你会发现它里面既没有src / main / java或src / main / resources文件夹。因此,当您通过JAR运行时,尝试从那些(现在不存在的)路径手动读取将失败。其他两个答案都有很好的建议,使用getResourceAsStream
方法读取您的文件。甚至是Properties对象上的一个方法,使得它非常方便易用:
URL resourceURL = Thread.currentThread().getContextClassLoader()
.getResource(yourpropertyfilename);
Properties props = new Properties();
props.load(resourceURL.openStream());
答案 3 :(得分:2)
在运行时,此文件将位于类路径中。使用Class.getResourceAsStream()
进行访问。