Подтвердить что ты не робот

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

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

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

Проблема:

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

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

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

1) На daddy pom Замените [профили] плагинами, имеющими [фазу] none [/phase]

<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) На том же pom добавлено расширение пользовательской сборки

<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 нужно определить свойство, которое будет сообщать расширению сборки, что делать, например, проект мальчика:

<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 в проекте daddy, как это, приведет к желаемому результату: мальчики будут мальчиками, девочки будут девочками, и оба будут детьми.

Вопрос: можем ли мы лучше?

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

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


Update

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

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

Возможно

Кто-нибудь знает расширение сборки, которое помогает с этим?

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

Однако существует решение с использованием профилей.

Фокус в том, что активация профиля на основе файлов фактически наследуется (она работает только с maven3)

См. daddy2.zip, прикрепленный к MNG-5127

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


Обновление 2

Кто-нибудь знает расширение сборки, которое помогает с этим?

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

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

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

4b9b3361

Ответ 1

Я думаю, что Maven Tiles может помочь вам в вашем конкретном случае использования. Он по-прежнему работает, но в настоящее время он выполняет то, что вы описываете, мне удалось "разложить" wicket-quickstart и запустить Jetty успешно, даже добавив многомодульную структуру.

Любые комментарии или подсказки более чем приветствуются. Благодаря, Маурицио