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