I have a Java webapp project that I develop in Eclipse (more precisely MyEclipse 10) and build using Maven 3.
I have the following layout (including only the files relevant to my problem :
project root
|-- src
| |-- main
| | |-- java
| | |-- resources
| | | |-- log4j.xml
| | | +-- struts.properties
| | |-- webapp
| | | |-- META-INF
| | | | +--context.xml
| | |-- config
| | | |-- test
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| | | +-- prod
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| +--test
+--pom.xml
As you can see, I included a number of configuration files. The one who are at their proper location within the project struture, i.e. inside src/main/resources
and src/main/webapp
are the ones that I routinely use when I work in MyEclipse. I can use MyEclipse connectors to automatically update a deployment to e.g. a Tomcat instance on my dev machine. I just click "run server" and I can debug. No need to use Maven at all in this context actually.
Then, when I want to build a release for another environment such as testing or production, I run mvn -P test clean install
and it builds a nice WAR.
My goal is to replace the configuration files inside the final WAR by those in src/config/{environment}/
.
I have set profiles in my pom.xml
:
<profiles>
<profile>
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
Then, I try to copy these resources from the specified profile (using the environment
variable) to the correct location inside the WAR (or the temporary folder that will be zipped into a WAR) :
<webResources>
<resource>
<directory>/src/main/config/${environment}</directory>
<targetPath>META-INF/</targetPath>
<includes>
<include>context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/config/${environment}</directory>
<targetPath>WEB-INF/classes/</targetPath>
<includes>
<include>
struts.properties
</include>
<include>
log4j.xml
</include>
</includes>
</resource>
</webResources>
Now this seems to work, except that the "standard" resources are copied to the directory AFTER this, so they overwrite these files. So I always end up with e.g. the log4j.xml
from src/main/resources
instead of the one from say src/main/configuration/prod/
Extract from the Maven output :
[INFO] Processing war project
[INFO] Copying webapp webResources [D:\workspace\MyProject/src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp webResources [D:\workspace\MyProject\src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp resources [D:\workspace\MyProject\src\main\webapp]
As you can see on the last line, stuff from src/main/webapp
is copied AFTER, thus overwriting my custom files :(
My question : How to force Maven to use the files "from the activated profile" and somehow OVERWRITE the "natural" files ?