Динамическая конфигурация плагина Maven

У меня есть в POM что-то вроде этого:

    <profile>
        <id>profile1</id>
        <build>
            <resources>
                ....
            </resources>

            <plugins>
                <plugin>
                    <configuration>
                        ....plugin1 configuration.....
                    </configuration>
                </plugin>
                <plugin>
                    <configuration>
                        ....plugin2 configuration.....
                        <configEntry1></configEntry1>
                        <configEntry2></configEntry1>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

В профиле мало плагинов, у этих плагинов есть конфигурации и исполнения. В зависимости от работы Дженкинса (я хочу создать десктопное Java-приложение для Win, Unix, Mac OS) конфигурация плагина может иметь небольшие изменения. Например, если я запускаю задание для Mac, во второй конфигурации плагина не должно быть configEntry2.

Мне нужно создать профиль для каждой работы и скопировать 99% конфигурации XML профиля. Есть ли способ повторно использовать аналогичные детали?

Существует ли наследование профилей? Например, profile2, profile3 могут наследовать все плагины, их выполнение и конфигурацию от profile1, но я переопределю конфигурацию для одного плагина.

Или я могу установить динамическую конфигурацию в зависимости от свойства? Например: <configEntry2 ifTrue="${property.name}"></configEntry1>. Не надо

Есть ли что-то подобное?

Спасибо за ответы.

ИЗМЕНИТЬ – добавить конкретный пример:

Профиль 1:

<profile>
    <id>profile1</id>
    <plugin>
        <groupId>com.zenjava</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>8.8.3</version>
        <configuration>
            <identifier>fxApplication</identifier>
            <appName>AppName</appName>
            <mainClass>package.Main</mainClass>
            <nativeReleaseVersion>${jfx.version}</nativeReleaseVersion>
            <jfxMainAppJarName>jarName.jar</jfxMainAppJarName>
            <deployDir>${basedir}/deploy</deployDir>            
            <updateExistingJar>true</updateExistingJar>
            <manifestAttributes>
                <JavaFX-Feature-Proxy>None</JavaFX-Feature-Proxy>
                <Implementation-Vendor>vendor</Implementation-Vendor>
                <Implementation-Title>Title</Implementation-Title>              
                <Main-Class>package.Main</Main-Class>
                <JavaFX-Version>2.0</JavaFX-Version>
                <JavaFX-Application-Class>package.Main</JavaFX-Application-Class>
                <Created-By>Company</Created-By>
            </manifestAttributes>
            <jvmArgs>
                <jvmArg>-XX:-UseParallelGC -XX:+HeapDumpOnOutOfMemoryError -Xmx8G -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=10 -XX:MaxHeapFreeRatio=40</jvmArg>-->
            </jvmArgs>
            <additionalAppResources>${basedir}/target/jfx/externalResources</additionalAppResources>
        </configuration>

        <executions>
            <execution>             
                <id>create-jfxjar</id>
                <phase>package</phase>
                <goals>
                    <goal>build-jar</goal>
                </goals>
            </execution>
            <execution>
                <id>create-native</id>
                <phase>package</phase>
                <goals>
                    <goal>build-native</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</profile>

и профиль2:

<profile>
    <id>profile2</id>
    <plugin>
        <groupId>com.zenjava</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>8.8.3</version>
        <configuration>
            <identifier>fxApplication</identifier>
            <appName>AppName</appName>
            <mainClass>package.Main</mainClass>
            <nativeReleaseVersion>${jfx.version}</nativeReleaseVersion>
            <jfxMainAppJarName>jarName.jar</jfxMainAppJarName>
            <deployDir>${basedir}/deploy</deployDir>            
            <updateExistingJar>true</updateExistingJar>
            <manifestAttributes>
                <JavaFX-Feature-Proxy>None</JavaFX-Feature-Proxy>
                <Implementation-Vendor>vendor</Implementation-Vendor>
                <Implementation-Title>Title</Implementation-Title>              
                <Main-Class>package.Main</Main-Class>
                <JavaFX-Version>2.0</JavaFX-Version>
                <JavaFX-Application-Class>package.Main</JavaFX-Application-Class>
                <Created-By>Company</Created-By>
            </manifestAttributes>           
            <additionalAppResources>${basedir}/target/jfx/externalResources</additionalAppResources>
        </configuration>

        <executions>
            <execution>             
                <id>create-jfxjar</id>
                <phase>package</phase>
                <goals>
                    <goal>build-jar</goal>
                </goals>
            </execution>
            <execution>
                <id>create-native</id>
                <phase>package</phase>
                <goals>
                    <goal>build-native</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</profile>

разница только в том, что в профиле2 нет <jvmArgs>

Как я могу повторно использовать 99% скрипта xml?


person Jack    schedule 06.08.2018    source источник
comment
Вы знаете, что профиль может быть активирован конкретной операционной системой? См. maven.apache.org/guides/introduction/.   -  person khmarbaise    schedule 06.08.2018
comment
Спасибо за ваш комментарий, но меня не интересует активация профиля, меня интересует повторное использование конфигурации или зависимость конфигурации от свойств   -  person Jack    schedule 06.08.2018
comment
Вопрос в том, для какой цели это действительно нужно и какие части конфигурации отличаются... или, другими словами, какие части конфигурации являются частью всех конфигураций, а какие особенными...   -  person khmarbaise    schedule 06.08.2018
comment
‹plugin›‹configuration›‹jvmArgs› ‹jvmArg›Здесь аргументы jvm‹/jvmArg›--› ‹/jvmArgs›‹/configuration› ‹/plugin› В одном случае мне нужно указать аргументы, в другом случае аргументы указывать не нужно   -  person Jack    schedule 06.08.2018


Ответы (2)


Вы можете объявить, конечно, но также активировать более одного профиля одновременно. Создайте один с <id>all</id>, который содержит объявления, общие для всех, и дополнительные, которые расширяют этот, например. WinUnix, который содержит <configEntry2>.

Затем для сборки Mac:

mvn ... -P all ...

и для сборок Windows/Unix:

mvn ... -P all,WinUnix ...

Вы также можете использовать обратную логику или их комбинацию с деактивацией профиль.

person Gerold Broser    schedule 06.08.2018

Чтобы обратиться к вашему конкретному примеру, я бы предложил использовать свойство для jvmargs. Например, вот простой POM, который печатает сообщение во время сборки:

<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>
    <groupId>maven-profiles</groupId>
    <artifactId>maven-profile-artifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <specialMessage>This is the default value</specialMessage>
    </properties>
    <profiles>
        <profile>
            <id>profile1</id>
            <properties>
                <specialMessage>This comes from profile1</specialMessage>
            </properties>
        </profile>
    </profiles>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>${specialMessage}</echo>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Обратите внимание, как первый тег properties определяет сообщение по умолчанию, когда ни один профиль не активен. Позже внутри profile1 свойству присваивается конкретное значение, показывающее, что profile1 активно. Таким образом, тег сборки и все его дочерние элементы являются общими/общими, но сообщение меняется в зависимости от того, активен ли профиль1 или нет.

Я также согласен с ответом Gerold Broser в том, что если у вас был более сложный сценарий - скажем, вам нужно было указать разные плагины для сборка - вы можете создать несколько профилей и активировать более одного. Таким образом, ваши общие плагины и конфигурация могут быть в одном профиле, а элементы, характерные для конкретной среды/сценария, могут быть в другом.

Надеюсь это поможет!

person D.B.    schedule 02.09.2018