How to replace a value in web.xml with a Maven property?
I have a Maven project that downloads some test files into its build directory ./target/files
. These files should then be available to a servlet, which I can easily achieve by hardcoding the full path as an <init-param>
of the servlet:
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>my.package.TestServlet</servlet-class>
<init-param>
<param-name>filepath</param-name>
<param-value>/home/user/testproject/target/files</param-value>
</init-param>
</servlet>
How can I avoid hardcoding the full path and use a dynamic parameter replacement instead? I tried the following, but it did not work:
<param-value>${project.build.directory}/files</param-value>
Add to your pom section:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<directory>src/main/webapp</directory>
<includes>
<include>**/web.xml</include>
</includes>
</resource>
</webResources>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
</configuration>
</plugin>
See Maven: Customize web.xml of web-app project for more details
You can simply use maven filtering resources:
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>
You can also combine this and would like to filter some files whereas others shouldn't be filtered:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
...
</resources>
Put appropriate placeholders into the files you would like having replaced things like ${home}.
You can use Replace Ant Task to do it.
Heres a sample Implementation where i replace the tokenkeys in a property file , adapt it to suit your needs
test.properties
SERVER_NAME=@SERVER_NAME@
PROFILE_NAME=@PROFILE_NAME@
pom.xml
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>compile</phase>
<configuration>
<tasks>
<replace dir="${basedir}/src/main/resources" >
<include name="**/*.properties"/>
<replacefilter token="@SERVER_NAME@" value="My Server"/>
<replacefilter token="@PROFILE_NAME@" value="My Profile"/>
</replace>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
voila! Now execute
mvn clean package
I think you can use maven-war-plugin's filteringDeploymentDescriptors option to filter deployment descriptors -
<properties>
<maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
</properties>