Почему плагин Maven EAR переопределяет созданный файл application.xml на этапе пакета?
У меня есть проект EAR Maven, где я хочу отфильтровать <contextRoot>
модулей EAR в соответствии с набором свойств по умолчанию или определенными в профиле.
Pom.xml выглядит так:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ibm.iepd.maven</groupId>
<artifactId>iepd-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.ibm.iepd</groupId>
<artifactId>iepd-web-admin-ear</artifactId>
<packaging>ear</packaging>
<version>${iepd.release}</version>
<description>IEPD Web Admin EAR project.</description>
<properties>
<iepd.admin.rest.contextRoot>/admin-rest</iepd.admin.rest.contextRoot>
<iepd.email.broker.rest.contextRoot>/iepdeb-rest</iepd.email.broker.rest.contextRoot>
</properties>
<dependencies>
<dependency>
<groupId>com.ibm.iepd</groupId>
<artifactId>iepd-admin-rest</artifactId>
<version>${iepd.release}</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.ibm.iepd</groupId>
<artifactId>iepd-email-broker-rest</artifactId>
<version>${iepd.release}</version>
<type>war</type>
</dependency>
</dependencies>
<build>
<finalName>iepd-web-admin</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<version>6</version>
<applicationName>iepd-web-admin</applicationName>
<description>IEPD Web Admin</description>
<generateModuleId>true</generateModuleId>
<fileNameMapping>no-version</fileNameMapping>
<!-- If not specified, then during the ear:ear goal, another application.xml will be generated using default contextRoot for modules -->
<applicationXml>${project.build.directory}/${project.build.finalName}/META-INF/application.xml</applicationXml>
<modules>
<webModule>
<groupId>com.ibm.iepd</groupId>
<artifactId>iepd-admin-rest</artifactId>
<contextRoot>${iepd.admin.rest.contextRoot}</contextRoot>
</webModule>
<webModule>
<groupId>com.ibm.iepd</groupId>
<artifactId>iepd-email-broker-rest</artifactId>
<contextRoot>${iepd.email.broker.rest.contextRoot}</contextRoot>
</webModule>
</modules>
</configuration>
</plugin>
</plugins>
</build>
<!-- CDT BETA profile -->
<profiles>
<profile>
<id>beta</id>
<activation>
<property>
<name>env</name>
<value>beta</value>
</property>
</activation>
<properties>
<iepd.admin.rest.contextRoot>/admin-rest/SIT</iepd.admin.rest.contextRoot>
<iepd.email.broker.rest.contextRoot>/iepdeb-rest/SIT</iepd.email.broker.rest.contextRoot>
</properties>
</profile>
</profiles>
</project>
Как вы можете видеть выше, мне пришлось настроить плагин maven-ear-plugin <applicationXml>
местоположение, заставляя его использовать application.xml, сгенерированный в ${project.build.directory}/${project.build.finalName}/META-INF/application.xml
, Если я не установлю это в теге конфигурации <applicationXml>
Ещё жестко активирую профиль (-Pbeta
или же -Denv=beta
), <contextRoot>
тег не заменяется в последнем файле application.xml, упакованном в EAR.
Когда я бегу mvn clean package
вот что я получаю:
- Создает application.xml в корне целевого каталога.
<contextRoot>
тег заменяется на свойства по умолчанию (не те, что в профиле). Это нормально и что я ожидаю. - Сгенерированный application.xml в
target/iepd-web-admin/META-INF
тоже правильно. Это нормально и что я ожидаю.
Тем не менее, если я упаковываю EAR, активирую работающий профиль mvn clean package -Pbeta
Я получаю это:
- Создает application.xml в корне целевого каталога.
<contextRoot>
тег заменен на свойства из профиля. Это нормально и что я ожидаю. - Сгенерированный application.xml в
target/iepd-web-admin/META-INF
НЕПРАВИЛЬНО и использует значения свойств по умолчанию, а не значения из активированного профиля. Это не хорошо, и я не ожидаю.
Таким образом, файл application.xml, упакованный в EAR, target/iepd-web-admin/META-INF
,
После нескольких часов борьбы я нашел способ заставить плагин EAR использовать тот, что сгенерирован в target/iepd-web-admin/META-INF
используя собственность <applicationXml>
Одним из тестов, которые я сделал, было запустить только process-resources
или же generate-resources
этап строительства и в этой ситуации оба target/application.xml
а также target/iepd-web-admin/META-INF/application.xml
генерируются правильно, с правильной заменой. Таким образом, я думаю, что maven-ear-plugin может генерировать ДРУГОЙ application.xml во время фазы пакета, которая не заменяется / не фильтруется свойствами профиля и, следовательно, переопределяет 1-й. Когда я устанавливаю конфигурацию плагина <applicationXml>
указывая на это target/iepd-web-admin/META-INF/application.xml
тогда он использует присутствующий там файл и не переопределяет его.
Итак, мне интересно, действительно ли это правильное поведение, потому что оно кажется мне глючным и не тривиальным. Есть мысли по этому поводу? Есть ли другой способ добиться этого?
Заранее спасибо!