如何在 Web 应用程序中读取属性文件? [复制]

Posted

技术标签:

【中文标题】如何在 Web 应用程序中读取属性文件? [复制]【英文标题】:How to read properties file in web application? [duplicate] 【发布时间】: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 阅读它,但它需要完整路径,这是不可接受的。

有什么想法吗?

【问题讨论】:

【参考方案1】:

几个注意事项:

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

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

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

    /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 以引用属性文件。

例如:

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

    使用以下代码:

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

就是这样。不需要 InputStreams。

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

【讨论】:

以上是关于如何在 Web 应用程序中读取属性文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring项目中读取属性文件?

.Net Core Web应用加载读取Json配置文件

如何在 Flask 中捕获和读取传入 HTTP 请求的标头? [复制]

无法使用 Web 应用程序读取属性文件(带有 JSF 的 Maven Web 应用程序)

在java中读取属性文件时出错[复制]

java中如何读取xml中数据。多节点的。给我一个例子,谢谢。