Importar configuração do plugin maven por composição em vez de herança. Pode ser feito com extensões de compilação?

Importar configuração do plugin maven por composição em vez de herança. Pode ser feito com extensões de compilação?

Eu usei maven por mais de 3 anos e há uma falha que sempre me incomodou. Já é hora de encontrar uma solução para isso.

O problema:

Eu tenho um módulo "papai" com três filhos: "menino", "menina" e "criança". Cada um desses filhos deve ter seu próprio conjunto distinto de configurações de plug-ins para uma construção padrão de "instalação limpa". Eu não quero colocar essa configuração nos poms das crianças. Eu prefiro colocar em algum lugar que eu possa reutilizar mais tarde.

Eu tentei usar perfis para isso, e ele não funciona - por favor, veja meu comentário e projeto anexado emMNG-5127

Eu encontrei uma solução melhor, fazendo as seguintes alterações nodaddy.zip projeto:

1) No pom do papai, substituiu os [perfis] por execuções de plugins com [fase] nenhuma [/ 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) No mesmo pom, adicionou uma extensão de compilação personalizada

<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) A extensão alterará as fases de execução do plug-in com base nos valores de propriedade do projeto. Código Java abaixo.

@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) Os poms do módulo filho precisam apenas definir uma propriedade que diga à extensão de construção o que fazer, por exemplo, o projeto 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>

Invocar mvn clean install no projeto do papai como este, produzirá o resultado desejado: meninos serão meninos, meninas serão meninas e ambos serão crianças.

A questão é: podemos fazer melhor?

Em teoria, uma extensão de compilação poderia importar as definições de configuração de compilação para boy, girl e kid de diferentes poms ... certo? Essa seria uma forma inteligente e elegante de importar a configuração [build] para um pom.

Há muitos plug-ins de maven disponíveis, mas não vejo muito (na verdade, nenhum) de extensões de compilação disponíveis que possam ser incluídas em uma compilação. Alguém sabe de uma extensão de compilação que ajuda com isso?

Atualizar

Esta não é uma resposta real, mas é uma solução real para o meu problema, então aqui vai.

Importar configuração do plugin maven por composição em vez de herança. Pode ser feito com extensões de compilação?

Provavelmente

Alguém sabe de uma extensão de compilação que ajuda com isso?

Tenho certeza que não há um

No entanto, existe uma solução usando perfis.

O truque é queativação de perfil baseada em arquivo é realmente herdada (só funciona com o maven3)

por favor veja odaddy2.zip anexado aMNG-5127

Isso é muito melhor do que usar a estratégia de extensão de compilação, porque usar um perfil fornece mais flexibilidade do que apenas alterar algumas fases de execução do plug-in.

Atualização 2

Alguém sabe de uma extensão de compilação que ajuda com isso?

Tenho certeza que não há um

Na verdade, há alguma coisa!

Está anexado como projeto emMNG-5102 (por Maurizio Pillitu) Eu não testei, mas parece que faz algo muito próximo da extensão de construção proposta.

questionAnswers(1)

yourAnswerToTheQuestion