Импорт конфигурации подключаемого модуля 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, но я не вижу большого количества (вообще-то) доступных расширений сборки, которые можно подключить к сборке. Кто-нибудь знает расширение сборки, которое помогает с этим?


Обновить

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

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

Наверное

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

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

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

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

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

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


Обновление 2

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

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

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

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

1 ответ

Решение

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

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

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