I have a servlet deployed as a war in JBoss 4.0.2. I have a properties file for the deployed application. Where should I put this file? Under the conf directory in the jboss server\default\conf folder? How do I load that properties file in a portable manner?
The best place to put it is under the web-apps' own doc-root, like "./WEB-INF/myapp.properties", i.e. relative to where the servlet container unpacked your .war
or .ear
file. You can provide the properties file directly in the .war
.
The ServletContext
has a method getRealPath(String path)
that returns the actual path in the filesystem. Using the real path you can load it in a Properties
collection.
Update The code in your comment tries to lookup real path for "/", you should ask for the relative path to your properties file, as in:
String propertiesFilePath = getServletContext().getRealPath("WEB-INF/application.properties");
Properties props = properties.load(new FileInputStream(propertiesFilePath));
If the properties file can be deployed along with the application make it part of your source tree. This will result in the properties file to be in the WEB-INF/classes folder.
This can then be read using
Properties properties = loadProperties("PropertyFileName.properties", this.getClass());
...
public static Properties loadProperties(String resourceName, Class cl) {
Properties properties = new Properties();
ClassLoader loader = cl.getClassLoader();
try {
InputStream in = loader.getResourceAsStream(resourceName);
if (in != null) {
properties.load(in);
}
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
Just get hold of the servletContext and then
InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/log4j.properties");
Properties props = new Properties();
props.load(stream);
This will always work, regardless of whether you deploy a war or exploded war.
To load that properties file in a portable manner, the best way would be to put it on the classpath of the web application (either in a JAR under WEB-INF/lib/
or under WEB-INF/classes/
or on the app server classpath if you want to be able to edit that file without repackaging your web application) and to use Class#getResourceAsStream(String)
.
The following code gets an InputStream
for a property file which resides in the same package as the servlet in which the code is executed:
InputStream inStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("myfile.properties");
Then, load(InputStream)
it into a Properties
object (skipping Exception handling):
Properties props = new Properties();
props.load(inStream);
The project that required this got canceled so I never followed up.