为什么执行时不能读取/ src / main / resources下的文件?

时间:2011-12-30 15:30:24

标签: java eclipse maven

我有一个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中,还是我必须使用其他方式加载它?

4 个答案:

答案 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()进行访问。