У меня есть проект Java webapp, который я разрабатываю в Eclipse (точнее MyEclipse 10) и строю с использованием Maven 3.
У меня следующий макет (включая только файлы, относящиеся к моей проблеме:
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
Как видите, я включил несколько файлов конфигурации. Те, кто находятся в надлежащем месте в структуре проекта, т.е. внутри src/main/resources
и src/main/webapp
, я обычно использую, когда работаю в MyEclipse. Я могу использовать коннекторы MyEclipse для автоматического обновления развертывания, например, экземпляр Tomcat на моей машине разработчика. Я просто нажимаю «запустить сервер» и могу отлаживать. На самом деле нет необходимости использовать Maven в этом контексте.
Затем, когда я хочу создать выпуск для другой среды, такой как тестирование или производство, я запускаю mvn -P test clean install
, и он создает красивую WAR.
Моя цель - заменить файлы конфигурации внутри финальной WAR на файлы из src/config/{environment}/
.
Я установил профили в моем pom.xml
:
<profiles>
<profile>
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
Затем я пытаюсь скопировать эти ресурсы из указанного профиля (используя переменную environment
) в правильное место внутри WAR (или во временную папку, которая будет заархивирована в 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>
Теперь, похоже, это работает, за исключением того, что "стандартные" ресурсы копируются в каталог ПОСЛЕ этого, поэтому они перезаписывают эти файлы. Так что я всегда получаю, например, log4j.xml
от src/main/resources
вместо того, скажем от src/main/configuration/prod/
Выдержка из вывода 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]
Как вы можете видеть в последней строке, материал из src/main/webapp
копируется ПОСЛЕ, таким образом перезаписывая мои пользовательские файлы :(
Мой вопрос: как заставить Maven использовать файлы «из активированного профиля» и как-то ПЕРЕЗАПИСАТЬ «натуральные» файлы?