Maven: как заполнить переменную в файле web.xml
Я работаю в веб-проекте Maven через Eclipse. в web.xml
У меня есть context-param, значение которого должно меняться в зависимости от профиля, который я использую при запуске Maven.
<context-param>
<param-name>producao</param-name>
<param-value>${ambiente.producao}</param-value>
</context-param>
В файле pom для проекта у меня есть следующая конфигурация:
<project>
<profiles>
<profile>
<id>prod</id>
<properties>
<ambiente.producao>true</ambiente.producao>
</properties>
</profile>
<profile>
<id>desenv</id>
<properties>
<ambiente.producao>false</ambiente.producao>
</properties>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/webapp/WEB-INF/</directory>
<filtering>true</filtering>
<includes>
<include>**/web.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.5</version>
<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>
</plugins>
</build>
</project>
Я использую оба resources
пометьте как плагин maven-war-plugin согласно ссылкам, которые я нашел в интернете. Однако это не сработало, как ожидалось. В Eclipse я запускаю maven с целями чистой установки и как "Профили" либо prod, либо desenv. После запуска Maven я заметил, что в web.xml
, ${ambiente.producao}
имущество не заменяется. Поэтому я хотел бы знать, что я сделал не так. Должен ли я использовать только фильтрующий ресурс или maven-war-plugin?
Спасибо,
Рафаэль Афонсо
1 ответ
Не верьте всему, что читаете в Интернете. Вы должны удалить src/main/webapp/WEB-INF/ из списка ресурсов, он просто отфильтрует ваш web.xml в target/classes
Ваш maven-war-plugin
Конфигурация просто необходима:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.5</version>
<configuration>
<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
</configuration>
</plugin>
Теперь, независимо от того, используете ли вы Maven CLI или Eclipse, вам нужно включить один из этих профилей. В командной строке вам нужно запустить
мвн чистый пакет -Пдесенв
В Eclipse (если вы используете дистрибутив Luna Java EE или более новый), вы можете включить нужный вам профиль, нажав Ctrl+Alt+P
, Если вы включите desenv
вы увидите отфильтрованный web.xml под target/m2e-wtp/web-resources/WEB-INF/
Это файл, который будет опубликован на вашем сервере приложений.
Если вам случится включить оба профиля одновременно, последний профиль, указанный в вашем файле pom.xml, имеет приоритет.
Лично я бы удалил производственный профиль и поместил производственные свойства в раздел свойств по умолчанию вашего pom.xml. Таким образом, вы всегда фильтруете свой web.xml по фактическим значениям, и у вас будет меньше шансов случайно собрать и развернуть приложение с непроизводственными настройками.
И для того, чтобы включить desenv
профиль автоматически в Eclipse, вы можете добавить следующее правило активации:
<profile>
<id>desenv</id>
<!-- This profile is only activated when building in Eclipse with m2e -->
<activation>
<property>
<name>m2e.version</name>
</property>
</activation>
<properties>
<ambiente.producao>false</ambiente.producao>
</properties>
</profile>
Подробнее о поддержке динамической фильтрации ресурсов в m2e-wtp здесь: https://developer.jboss.org/en/tools/blog/2011/05/03/m2eclipse-wtp-0120-new-noteworthy
И там есть скринкаст: http://screencast.com/t/hwodHqODBB