Tengo un proyecto de aplicación web de Java que desarrollo en Eclipse (más precisamente MyEclipse 10) y construyo utilizando Maven 3.¿Cómo sobrescribir los archivos en el archivo WAR durante la creación de maven?
tengo la siguiente distribución (incluyendo sólo los archivos pertinentes a mi problema:
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
Como puede ver, incluí una serie de archivos de configuración. Los que están en su ubicación correcta dentro de la estructura del proyecto, es decir, dentro de src/main/resources
y src/main/webapp
son los que uso de forma rutinaria cuando trabajo en MyEclipse. Puedo usar conectores MyEclipse para actualizar automáticamente una implementación, por ejemplo, una instancia de Tomcat en mi máquina de desarrollo. Solo hago clic en "ejecutar servidor" y puedo error. No es necesario usar Maven en este contexto en realidad.
Luego, cuando quiero crear una versión para otro entorno, como las pruebas o la producción, ejecuto mvn -P test clean install
y crea un buen WAR.
Mi objetivo es reemplazar los archivos de configuración dentro de la GUERRA final por aquellos en src/config/{environment}/
.
he puesto perfiles en mi pom.xml
:
<profiles>
<profile>
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
Entonces, trato de copiar estos recursos desde el perfil especificado (usando la variable environment
) a la ubicación correcta dentro de la GUERRA (o la carpeta temporal que se comprimen en un 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>
Ahora bien, esto parece funcionar, excepto que los recursos "estándar" se copian en el directorio después de esto, por lo que sobrescribir estos archivos. Así que siempre termino con, por ejemplo, la log4j.xml
de src/main/resources
en lugar de la de por ejemplo src/main/configuration/prod/
Extracto de la salida de Maven:
[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]
Como se puede ver en la última línea, cosas de src/main/webapp
se copia DESPUÉS, sobrescribiendo por lo tanto mis archivos personalizados: (
Mi pregunta: ¿Cómo forzar Maven para utilizar los archivos "desde el perfil activado" y de algún modo sobrescribir los archivos "naturales"
Brillante pieza de información. Estaba buscando la solución exacta y la obtuve. Muchas gracias. –