【问题标题】:How to read properties file in web application? [duplicate]如何在 Web 应用程序中读取属性文件? [复制]
【发布时间】:2011-03-10 19:05:32
【问题描述】:

属性文件位置是WEB-INF/classes/auth.properties

我不能使用特定于 JSF 的方式(使用 ExternalContext),因为我需要服务模块中的属性文件,而该服务模块不依赖于 web 模块。

我已经试过了

MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties");

但它返回null

我也尝试使用FileInputStream 阅读它,但它需要完整路径,这是不可接受的。

有什么想法吗?

【问题讨论】:

    标签: java properties


    【解决方案1】:

    几个注意事项:

    1. 您应该更喜欢Thread#getContextClassLoader() 返回的ClassLoader

      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
      

      这将返回可以访问所有资源的最父类加载器。 Class#getClassLoader() 只会返回相关类的(子)类加载器,它本身可能无法访问所需的资源。它总是在具有单个类加载器的环境中工作,但并不总是在具有复杂的类加载器层次结构的环境中,如 webapps。

    2. /WEB-INF 文件夹不在类路径的根目录中。 /WEB-INF/classes 文件夹是。所以你需要加载相关的属性文件。

      classLoader.getResourceAsStream("/auth.properties");
      

      如果您选择使用Thread#getContextClassLoader(),请删除前导/

    使用ServletContext#getResourceAsStream()“幕后”的JSF 特定ExternalContext#getResourceAsStream() 仅从网络内容(/WEB-INF 文件夹所在的位置)返回资源,而不是从类路径返回。

    【讨论】:

    • @unbeli: 祝你好运,然后将它作为 JAR 分发:)
    • @BalusC 您在建议仅使用上下文类加载器之前编辑了您的答案。很明显,问题不在于错误的类加载器,而是错误的路径。
    • 另外:如果资源属于类并且不是外部配置,你应该使用only Class#getResource() / getResourceAsStream()。 Class#getClassLoader() 不会返回任何子类加载器。上下文类加载器无权访问所有资源。
    • @unbeli:你误解了我的意思。我是说使用ClassLoader#getResourceAsStream() 比使用ExternalContext#getResourceAsStream() 更推荐。另请参阅编辑历史记录。我删除了它,因为 OP 提到它无论如何都不是一个选项(我忽略了)。如果您删除反对票,我将不胜感激。
    • @unbeli:如果您想将资源外部化和/或希望能够覆盖它而不在每次编辑文件时重新构建/重新部署整个 web 应用程序,这将非常有用。
    【解决方案2】:

    试试这个:

    MyService.class.getClassLoader().getResourceAsStream("/auth.properties");
    

    使用getResourceAsStream 读取文件会在类路径上查找要加载的资源。由于classes 目录位于您的webapp 的类路径中,因此将文件称为/auth.properties 应该可以。

    【讨论】:

      【解决方案3】:

      ResourceBundle (http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html) 解决了属性文件的相对/绝对路径的大部分问题。

      它使用 Resource 类并将其指向一个 Dummy Class 以引用属性文件。

      例如:

      1. 您有一个名为 MAINProperties.properties 的文件,其中有一个属性: mail.host=foo.example.com
      2. 在没有任何内容的情况下创建一个名为 MAINProperties 的虚拟类。
      3. 使用以下代码:

        ResourceBundle.getBundle("com.example.com.MAINProperties").getProperty("mail.host")

      就是这样。不需要 InputStreams。

      P.D. Apache Commons 有一个名为 Apache Commons Configuration 的库,它有很多功能(可重新加载的文件、多种域类型),可以结合使用上述功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2015-08-28
        • 2013-06-18
        • 2013-12-22
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多