How to read properties file in web application? [duplicate]
Properties file location is WEB-INF/classes/auth.properties.
I cannot use JSF-specific ways (with ExternalContext) because I need properties file in a service module which doesn't have a dependency on a web-module.
I've already tried
MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties");
but it returns null.
I've also tried to r开发者_如何学Pythonead it with FileInputStream but it requires the full path what is unacceptable.
Any ideas?
Several notes:
You should prefer the
ClassLoaderas returned byThread#getContextClassLoader().ClassLoader classLoader = Thread.currentThread().getContextClassLoader();This returns the parentmost classloader which has access to all resources. The
Class#getClassLoader()will only return the (child) classloader of the class in question which may not per se have access to the desired resource. It will always work in environments with a single classloader, but not always in environments with a complex hierarchy of classloaders like webapps.The
/WEB-INFfolder is not in the root of the classpath. The/WEB-INF/classesfolder is. So you need to load the properties files relative to that.classLoader.getResourceAsStream("/auth.properties");If you opt for using the
Thread#getContextClassLoader(), remove the leading/.
The JSF-specific ExternalContext#getResourceAsStream() which uses ServletContext#getResourceAsStream() "under the hoods" only returns resources from the webcontent (there where the /WEB-INF folder is sitting), not from the classpath.
Try this:
MyService.class.getClassLoader().getResourceAsStream("/auth.properties");
Reading files with getResourceAsStream looks on the classpath to find the resource to load. Since the classes directory is in the classpath for your webapp, referring to the file as /auth.properties should work.
ResourceBundle (http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html) resolve most of the problems with a relative/absotule path for Properties Files.
It uses the the Resource class and point it to a Dummy Class to make reference to a properties file.
For example:
- You a have file called MAINProperties.properties and inside it there is a property: mail.host=foo.example.com
- Create a Dummy Class called MAINProperties without nothing.
Use the following code:
ResourceBundle.getBundle("com.example.com.MAINProperties").getProperty("mail.host")
And That's it. No InputStreams Required.
P.D. Apache Commons has a Library Called Apache Commons Configuration that has a lot of capabilities (reloadable files, multiple domain types) that could be used in combination of the above.
加载中,请稍侯......
精彩评论