views:

1639

answers:

5

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?

A: 

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));
rsp
So I tried the following:String propertiesFilePath = getServletContext().getRealPath("/") + File.separator + "WEB-INF" + File.separator + "application.properties";properties.load(new FileInputStream(propertiesFilePath));I get a FileNotFoundException. I don't see what I did wrong.
Carlosfocker
+1  A: 

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;
}
Vinodh Ramasubramanian
+2  A: 

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.

julius
+4  A: 

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);
Pascal Thivent
A: 

The project that required this got canceled so I never followed up.

Carlosfocker