randomperson25
randomperson25

Reputation: 175

Load properties file in a java servlet deployed in JBoss as a war

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?

Upvotes: 8

Views: 28021

Answers (4)

Pascal Thivent
Pascal Thivent

Reputation: 570365

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);

Upvotes: 17

rsp
rsp

Reputation: 23373

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));

Upvotes: 1

julius
julius

Reputation: 875

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.

Upvotes: 5

Vinodh Ramasubramanian
Vinodh Ramasubramanian

Reputation: 3185

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;
}

Upvotes: 2

Related Questions