13

I would like to control the settings in web.xml and using different once for different environments.

Is it possible to use a property, from a property file on classpath, in web.xml? Something like this:

 <context-param>
  <param-name>myparam</param-name>
  <param-value>classpath:mypropertyfile.properties['myproperty']</param-value>
 </context-param>

Best regards

P

Sridhar Sarnobat
  • 25,183
  • 12
  • 93
  • 106
per_jansson
  • 2,103
  • 4
  • 29
  • 46
  • 2
    here is the solution: http://stackoverflow.com/questions/12099008/how-to-include-values-from-properties-file-into-web-xml/12099830#12099830 – lancha90 Aug 23 '12 at 21:18

3 Answers3

8

No. However you can pass the properties file in and read from it at runtime.

<context-param>
    <param-name>propfile</param-name>
    <param-value>myprop.properties</param-value>
</context-param>

It is then trivial to load the property at runtime if you have access to the servlet.

Properties properties = new Properties();
GenericServlet theServlet = ...;
String propertyFileName = theServlet.getInitParameter("propfile");
properties.load(getClass().getClassLoader().getResourceAsStream(propertyFileName));
Object myProperty = properties.get("myProperty");
Ken Blair
  • 337
  • 3
  • 4
4

If using different environments it's very likely that you won't be switching from one to another at runtime, thus not needing to use a properties file.

If using maven, you can define different profiles for your environments and set the parameter you want to change in each profile.

In your pom.xml

<profile>
    <id>env1</id>
    <properties>
        <my.param>myParamValue<my.param/>
    </properties>
</profile>

<profile>
    <id>env2</id>
    <properties>
        <my.param>myParamValue2<my.param/>
    </properties>
</profile>

In your web.xml

<context-param>
    <param-name>myparam</param-name>
    <param-value>${my.param}</param-value>
</context-param>

And configure filtering in your deployment descriptor in maven war plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>
</plugin>
Gabriel Molina
  • 539
  • 3
  • 14
2

AFAIK context-param and env-entry both hold static values. You will not get the runtime (dynamic) value from the property file. It will be like:

<context-param>     
  <param-name>myparam</param-name>     
  <param-value>myactualpropertyvalue</param-value>     
 </context-param>

Any change to the value needs a redeployment of the web app.

In your example, the value you retrieve would be the String classpath:mypropertyfile.properties['myproperty']

If you use Glassfish you can update it on the fly from commandline http://javahowto.blogspot.com/2010/04/glassfish-set-web-env-entry.html

If I understand your requirement is at build time (i.e different war for different env) and not during running time?

You could replace the values in web.xml as part of the ant/maven build process.

JoseK
  • 31,141
  • 14
  • 104
  • 131
  • 3
    Thanks for your response. However, it is at startup time that I would like to look for the property. I.e. the same war should have different properties for different env. I am not sure if it is possible at all to do this. At the moment I am doing almost like you suggest, I am replacing the value during a Maven build. – per_jansson Jun 03 '10 at 11:00
  • This is informative ... http://java.sun.com/developer/technicalArticles/xml/WebAppDev4/ – ingyhere Mar 22 '12 at 23:17
  • how would you call that context in your Java code? and where does 'classpath' point you to? – JesseBoyd Sep 08 '17 at 20:48