【问题标题】:Why isn't my file under /src/main/resources readable on execution?为什么我在 /src/main/resources 下的文件在执行时不可读?
【发布时间】:2011-12-30 15:30:24
【问题描述】:

我有一个 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 不能找不到。

我究竟做错了什么? .properties 文件不应该位于资源文件夹中还是我必须使用其他方式来加载它?

【问题讨论】:

    标签: java eclipse maven


    【解决方案1】:

    前两个答案是正确的,但我想提供更多背景信息。

    这个文件在两个地方。它从 /src/main/resources 开始,当您构建项目时,Maven 会将其复制到 /target/classes。

    在运行时,您不应访问源代码中的副本。否则,您的软件将需要访问源代码才能运行。相反,您应该访问可交付成果中的副本。在执行时,您可以放心地假设您会在类路径中找到它。它和你编译的类在同一个地方,所以如果它不在类路径上,你一开始就无法运行程序。这就是为什么您应该使用其他回答者提到的getResourceAsStream()

    (虽然对于生产软件,我确实推荐使用 Spring 的资源抽象来访问这些类型的东西。)

    【讨论】:

    • 感谢您的洞察!好像我错过了 maven 复制资源的部分。 :)
    【解决方案2】:

    使用

    YourClass.class.getResourceAsStream("/filename.properties");
    

    【讨论】:

      【解决方案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());
      

      【讨论】:

        【解决方案4】:

        在运行时,此文件将位于您的类路径中。使用Class.getResourceAsStream() 访问它。

        【讨论】:

          猜你喜欢
          • 2015-02-26
          • 2014-09-25
          • 2015-03-22
          • 2014-04-01
          • 2016-02-08
          • 2021-04-23
          • 1970-01-01
          • 2017-11-25
          相关资源
          最近更新 更多