如何在Web应用程序中读取属性文件?
属性文件位置是WEB-INF/classes/auth.properties
。
我不能使用特定于JSF的方法(使用ExternalContext),因为我需要服务模块中的属性文件,该模块不依赖于Web模块。
我已经试过了
MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties");
但它返回null
。
我也尝试用FileInputStream
读取它,但它需要完整的路径是不可接受的。
有任何想法吗?
几点说明:
-
您应该更喜欢
Thread#getContextClassLoader()
返回的ClassLoader
。ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
这将返回可访问所有资源的最基本类加载器。
Class#getClassLoader()
只返回有问题的类的(子)类加载器,它本身可能无法访问所需的资源。 它总是在具有单个类加载器的环境中工作,但并不总是在具有复杂的类加载器层次结构的环境中工作,如webapps。 -
/WEB-INF
文件夹不在类路径的根目录中。/WEB-INF/classes
文件夹是。 所以你需要加载相对于它的属性文件。classLoader.getResourceAsStream("/auth.properties");
如果您选择使用
Thread#getContextClassLoader()
,请删除前导/
。
使用ServletContext#getResourceAsStream()
“在ServletContext#getResourceAsStream()
下”的特定于JSF的ExternalContext#getResourceAsStream()
仅从webcontent( /WEB-INF
文件夹所在的位置)返回资源,而不是从类路径返回资源。
尝试这个:
MyService.class.getClassLoader().getResourceAsStream("/auth.properties");
使用getResourceAsStream
读取文件会查找类路径以查找要加载的资源。 由于classes
目录位于webapp的类路径中,因此将文件称为/auth.properties
应该有效。
ResourceBundle( http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html )通过属性文件的相对/ absotule路径解决了大多数问题。
它使用Resource类并将其指向Dummy Class以引用属性文件。
例如:
- 你有一个名为MAINProperties.properties的文件,里面有一个属性:mail.host = foo.example.com
- 创建一个名为MAINProperties的虚拟类,没有任何内容。
-
使用以下代码:
ResourceBundle.getBundle( “com.example.com.MAINProperties”)的getProperty( “mail.host”)
就是这样。 无需InputStreams。
PD Apache Commons有一个名为Apache Commons Configuration的库,它具有许多function(可重新加载的文件,多种域类型),可以与上述function结合使用。