Importar la configuración del complemento de Maven por composición en lugar de herencia. ¿Se puede hacer con extensiones de compilación?

Importar la configuración del complemento de Maven por composición en lugar de herencia. ¿Se puede hacer con extensiones de compilación?

He usado maven durante más de 3 años y hay una deficiencia que siempre me ha molestado. Es hora de encontrar una solución para eso ya.

El problema:

Tengo un módulo de "papá" con 3 niños: "niño", "niña" y "niño". Cada uno de estos elementos secundarios debe tener su propio conjunto distinto de configuraciones de complementos para una compilación predeterminada de "instalación limpia". No quiero poner esa configuración en los poms de los niños. Prefiero ponerlo en algún lugar que pueda volver a usar más tarde.

He intentado usar perfiles para eso, y no funciona. Por favor, vea mi comentario y el proyecto adjunto enMNG-5127

He encontrado una mejor solución haciendo los siguientes cambios en elpapi.zip proyecto:

1) En el pom de papá, se reemplazaron los [perfiles] con ejecuciones de complementos que tienen [fase] ninguna [/ fase]

<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) En el mismo pom, se agregó una extensión de compilación 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) La extensión cambiará las fases de ejecución del complemento en función de los valores de propiedad del proyecto. Código de Java a continuación.

@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) Los poms del módulo hijo solo necesitan definir una propiedad que le dirá a la extensión de compilación qué hacer, por ejemplo, el proyecto chico:

<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 en el proyecto de papi como este, producirá el resultado deseado: los niños serán niños, las niñas serán niñas y ambos serán niños.

La pregunta es: ¿podemos hacerlo mejor?

En teoría, una extensión de compilación podría importar las definiciones de configuración de compilación para niños, niñas y niños de diferentes poms ... ¿verdad? Esa sería la manera inteligente y elegante de importar la configuración [build] a un pom.

Hay muchos complementos de Maven disponibles, pero no veo muchos (en realidad ninguno) de extensiones de compilación disponibles que se pueden conectar a una compilación. ¿Alguien sabe de una extensión de construcción que ayuda con esto?

Actualizar

Esta no es una respuesta real, pero es una solución real para mi problema, así que aquí va.

Importar la configuración del complemento de Maven por composición en lugar de herencia. ¿Se puede hacer con extensiones de compilación?

Probablemente

¿Alguien sabe de una extensión de construcción que ayuda con esto?

Estoy bastante seguro de que no hay uno

Sin embargo, hay una solución utilizando perfiles.

El truco es quela activación del perfil basado en archivos se hereda realmente (aunque solo funciona con maven3)

Por favor vea elpapi2.zip adjunto aMNG-5127

Esto es mucho mejor que usar la estrategia de extensión de compilación, ya que usar un perfil proporciona más flexibilidad que solo cambiar algunas fases de ejecución del complemento.

Actualización 2

¿Alguien sabe de una extensión de construcción que ayuda con esto?

Estoy bastante seguro de que no hay uno

En realidad hay algo!

Se adjunta como proyecto en.MNG-5102 (por Maurizio Pillitu) No lo he probado, pero parece que hace algo muy cercano a la extensión de construcción propuesta.

Respuestas a la pregunta(1)

Su respuesta a la pregunta