Почему плагин 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 вот что я получаю:

  1. Создает application.xml в корне целевого каталога. <contextRoot> тег заменяется на свойства по умолчанию (не те, что в профиле). Это нормально и что я ожидаю.
  2. Сгенерированный application.xml в target/iepd-web-admin/META-INF тоже правильно. Это нормально и что я ожидаю.

Тем не менее, если я упаковываю EAR, активирую работающий профиль mvn clean package -PbetaЯ получаю это:

  1. Создает application.xml в корне целевого каталога. <contextRoot> тег заменен на свойства из профиля. Это нормально и что я ожидаю.
  2. Сгенерированный 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 тогда он использует присутствующий там файл и не переопределяет его.

Итак, мне интересно, действительно ли это правильное поведение, потому что оно кажется мне глючным и не тривиальным. Есть мысли по этому поводу? Есть ли другой способ добиться этого?

Заранее спасибо!

0 ответов

Другие вопросы по тегам