Импорт конфигурации подключаемого модуля maven по составу, а не по наследству. Можно ли это сделать с помощью расширений сборки?

Импорт конфигурации подключаемого модуля maven по составу, а не по наследству. Можно ли это сделать с помощью расширений сборки?

Я использовал Maven более 3 лет, и у меня всегда был один недостаток. Пришло время найти решение для этого уже.

Эта проблема:

У меня есть "папочка" модуль maven с 3 детьми: «мальчик», «девочка» и «малыш». У каждого из этих дочерних элементов должен быть свой собственный отдельный набор конфигураций плагинов для «чистой установки» по умолчанию. строить. Я не хочу помещать эту конфигурацию на детские помпоны. Я предпочел бы положить его куда-нибудь, чтобы потом использовать повторно.

Я пытался использовать профили для этого, и это не работает - см. Мой комментарий и прикрепленный проект наMNG-5127

Я нашел лучшее решение, внеся следующие изменения вdaddy.zip проект:

1) В папином поме заменили [профили] на выполнение плагинов, у которых [фаза] отсутствует [/ фаза]

<build>
    ...
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>printboy</id>
                    <phase>none</phase>
                    <configuration>
                        <target>
                            <echo message="@@@@@@@@@@@@ HELLO! Iam a BOY project"/>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
                <execution>
                    <id>printkid</id>
                    <phase>none</phase>
                    <configuration>
                        <target>
                            <echo message="@@@@@@@@@@@@ HELLO! Iam a KID project"/>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
                <execution>
                    <id>printgirl</id>
                    <phase>none</phase>
                    <configuration>
                        <target>
                            <echo message="@@@@@@@@@@@@ HELLO! Iam a GIRL project"/>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    ...
</build>

2) На том же поме добавлено собственное расширение сборки

<build>
    <extensions>
        <extension>
            <groupId>br.com.touchtec.maven.plugins</groupId>
            <artifactId>execution-enabler-extension</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </extension>
    </extensions>
    ...
</build>

3) Расширение изменит фазы выполнения плагина на основе значений свойств проекта. Java-код ниже.

@Component(role = AbstractMavenLifecycleParticipant.class, hint = "enableif")
public class EnableIfExtension extends AbstractMavenLifecycleParticipant {

    @Override
    public void afterProjectsRead(MavenSession session)
            throws MavenExecutionException {
        String phase = "validate";
        for(MavenProject project : session.getProjects()){
            Properties properties = project.getProperties();
            if(properties != null){
                if("boy".equals(properties.getProperty("project_type"))){
                    setExecutionPhase(project, "printboy", phase);
                    setExecutionPhase(project, "printkid", phase);
                }
                if("girl".equals(properties.getProperty("project_type"))){
                    setExecutionPhase(project, "printgirl", phase);
                    setExecutionPhase(project, "printkid", phase);
                }
                if("kid".equals(properties.getProperty("project_type"))){
                    setExecutionPhase(project, "printkid", phase);
                }
            }
        }
    }

    private void setExecutionPhase(MavenProject project, String executionId, String phase) {
        for(Plugin plugin : project.getBuild().getPlugins()){
            if(plugin.getExecutions() != null){
                for(PluginExecution execution : plugin.getExecutions()){
                    if(executionId.equals(execution.getId())){
                        execution.setPhase(phase);
                    }
                }
            }
        }
    }
}

4) Poms дочернего модуля должны только определить свойство, которое сообщит расширению сборки, что делать, например, проект boy:

<project>
    <properties>
        <project_type>boy</project_type>
    </properties>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.family</groupId>
    <artifactId>boy</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>com.family</groupId>
        <artifactId>daddy</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!-- No "build" section. Beautifull. -->
</project>

Вызов mvn clean install для проекта папочки, подобный этому, даст желаемый результат: мальчики будут мальчиками, девочки будут девочками, и оба будут детьми.

Вопрос в том, можем ли мы сделать лучше?

Теоретически, расширение сборки может импортировать определения конфигурации сборки для мальчика, девочки и ребенка из разных poms ... верно? Это был бы умный и элегантный способ импорта конфигурации [build] в pom.

Существует множество доступных плагинов maven, но я не вижу много (фактически любых) доступных расширений сборки, которые можно подключить к сборке. Кто-нибудь знает расширение сборки, которое помогает с этим?

Обновить

Это не фактический ответ, но это реальное решение моей проблемы, так что здесь идет.

Import maven plugin configuration by composition rather than inheritance. Can it be done with build extensions?

Наверное

Does anyone know of a build extension that helps with this?

Я уверен, что нет ни одного

Тем не менее, есть решение с использованием профилей.

Хитрость в том, чтоfile-based profile activation is actually inherited (хотя работает только с maven3)

Пожалуйста, посмотритеdaddy2.zip прикреплен кMNG-5127

Это намного лучше, чем использование стратегии расширения сборки, поскольку использование профиля обеспечивает большую гибкость, чем просто изменение нескольких этапов выполнения плагина.

Обновление 2

Does anyone know of a build extension that helps with this?

I'm pretty sure there isn't one

На самом деле есть что-то!

Он прикреплен как проект вMNG-5102 (Маурицио Пиллиту) Я не тестировал его, но, похоже, он что-то очень близко подходит к предлагаемому расширению сборки.

Ответы на вопрос(1)

Ваш ответ на вопрос