【问题标题】:Howto access properties file from Java EE web application?如何从 Java EE Web 应用程序访问属性文件?
【发布时间】:2010-03-02 09:23:23
【问题描述】:

我在 Eclipse 中创建了一个动态 Web 项目。我在 src 目录中创建了一个属性文件:

<project-root>/src/props.properties

我正在调试模式下通过 Eclipse 启动 Tomcat。现在我想从我的一个 POJO 中读取属性文件,但我得到了 FileNotFoundException。当前路径似乎是 Eclipse 路径。

我在网上查看了解决方案,但没有一个对我有用。也许我做错了什么。代码是这样的:

File file = new File("props.properties");
FileReader reader = new FileReader(file);
properties.load(reader);

我应该如何访问属性文件? 应该放在哪里?

提前致谢。

【问题讨论】:

    标签: java eclipse properties


    【解决方案1】:

    如果它是一个 Web 应用程序,那么属性将被部署到 WEB-INF/classes 并且可以使用类加载器进行加载

    InputStream in = {NameOfClassWhereThisisInvoked}.class.getResourceAsStream("/props.properties");
    properties.load(in);
    in.close();
    

    实际上,无论它是否是 web 应用程序,它都应该工作。

    我假设 src 被定义为源文件夹

    【讨论】:

    • 感谢大家的回答。我忘了提到我正在通过 eclipse 启动 tomcat。属性文件复制到:C:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\WebAppName\WEB-INF\classes。现在我在项目根目录和 src 文件夹中有一个 props 文件的副本,但无论如何我都无法访问它。
    • 你的 pojo 课在哪里?以上假设它们都由同一个类加载器加载
    • 这是要走的路。最好通过类加载器加载资源,以避免对本地文件系统排列、当前工作目录等的依赖。资源位置当然必须在类路径上,所以 WEB-INF/classes 是一个好地方。顺便说一句,如果您省略斜杠 - getResourceAsStream("props.properties") - 资源应该与当前类在同一个包中。
    【解决方案2】:

    还有另一种方法如下:

    File file = new File(session.getServletContext().getRealPath("/") + "props.properties");
    

    您可以提供相对于 Eclipse Web 应用程序项目的“WebContent”文件夹的任何路径,而不是“props.properties”。

    【讨论】:

      【解决方案3】:

      这是从类路径中的任何位置加载属性文件的正确方法

      private Properties getPropertiesFromClasspath(String propFileName)
                                                                      throws IOException
      {
          Properties props = new Properties();
          InputStream inputStream =
          this.getClass().getClassLoader().getResourceAsStream(propFileName);
      
          if (inputStream == null)
          {
              throw new FileNotFoundException("property file '" + propFileName
            + "' not found in the classpath");
      }
      
      props.load(inputStream);
      return props;
      }
      

      您可以创建一个单例类,以便在首次访问时将属性加载到内存中,然后通过静态方法使用它们。一个完整的例子可以在 http://bharatonjava.wordpress.com/2012/09/12/using-properties-file-in-java-application/

      【讨论】:

      • 您可能应该详细说明为什么这样做更好/与在类而不是类加载器上调用 getResourceAsStream 的权衡是什么。
      【解决方案4】:

      在src文件夹中保留你的属性文件,下面的代码足以读取属性文件

        **File file = new File("./src/config.properties");
        FileReader reader = new FileReader(file);
        prop.load(reader);
        System.out.println(prop.getProperty("directorypath"));**
      

      【讨论】:

        【解决方案5】:

        您的项目是否设置为自动构建?如果是这样(或者您正在手动构建),请检查props.properties 是否出现在项目的 output 文件夹中(在 Eclipse 中,这通常是“bin”,但可能是 WebRoot 或其他内容,具体取决于您的项目已建立)。

        当一个项目构建时,它应该复制配置文件以及编译的类、JSP 等。但是,我相信文件阅读器默认使用 JVM 的主目录作为其源代码。对于 Eclipse,这意味着您的 props.properties 文件必须位于项目 root 中,即不是“src”文件夹。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-14
          • 2010-10-04
          • 1970-01-01
          相关资源
          最近更新 更多