如何在 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 应用程序中读取属性文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flask 中捕获和读取传入 HTTP 请求的标头? [复制]