Importieren Sie die Konfiguration des Maven-Plugins nach Komposition und nicht nach Vererbung. Kann man das mit Build-Erweiterungen machen?

Importieren Sie die Konfiguration des Maven-Plugins nach Komposition und nicht nach Vererbung. Kann man das mit Build-Erweiterungen machen?

Ich benutze Maven seit mehr als 3 Jahren und es gibt ein Manko, das mich immer nervt. Es ist Zeit, dafür bereits eine Lösung zu finden.

Das Problem:

Ich habe ein "Daddy" -Maven-Modul mit 3 Kindern: "Junge", "Mädchen" und "Kind". Jedes dieser Kinder muss einen eigenen Satz von Plug-In-Konfigurationen für eine standardmäßige "Neuinstallation" haben. Ich möchte diese Konfiguration nicht auf die Poms der Kinder übertragen. Ich stelle es lieber an einen Ort, den ich später wiederverwenden kann.

Ich habe versucht, Profile dafür zu verwenden, und es funktioniert nicht - siehe meinen Kommentar und das angehängte Projekt unterMNG-5127

Ich habe eine bessere Lösung gefunden, indem ich die folgenden Änderungen an der vorgenommen habedaddy.zip Projekt:

1) Auf Papas Pom wurden die [Profile] durch Plugin-Ausführungen ersetzt, die [Phase] keine [/ Phase] haben.

<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) Auf demselben POM wurde eine benutzerdefinierte Build-Erweiterung hinzugefügt

<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) Die Erweiterung ändert die Ausführungsphasen des Plugins basierend auf den Eigenschaftswerten des Projekts. Java-Code unten.

@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) Das Kind-Modul poms muss nur eine Eigenschaft definieren, die der Build-Erweiterung mitteilt, was zu tun ist, zum Beispiel das Boy-Projekt:

<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>

Wenn Sie mvn clean install für das Daddy-Projekt wie dieses aufrufen, wird das gewünschte Ergebnis ausgegeben: Jungen sind Jungen, Mädchen sind Mädchen und beide sind Kinder.

Die Frage ist: Können wir es besser machen?

Theoretisch könnte eine Build-Erweiterung die Build-Konfigurationsdefinitionen für Jungen, Mädchen und Kinder aus verschiedenen Poms importieren ... oder? Das wäre die clevere und elegante Art, [Build] -Konfiguration in einen POM zu importieren.

Es gibt viele verfügbare Maven-Plugins, aber ich sehe nicht viele (tatsächlich alle) verfügbare Build-Erweiterungen, die man in einen Build einbinden kann. Kennt jemand eine Build-Erweiterung, die dabei hilft?

Aktualisieren

Dies ist keine wirkliche Antwort, aber es ist eine wirkliche Lösung für mein Problem.

Importieren Sie die Konfiguration des Maven-Plugins nach Komposition und nicht nach Vererbung. Kann man das mit Build-Erweiterungen machen?

Wahrscheinlich

Kennt jemand eine Build-Erweiterung, die dabei hilft?

Ich bin mir ziemlich sicher, dass es keinen gibt

Es gibt jedoch eine Lösung mit Profilen.

Der Trick ist dasDie dateibasierte Profilaktivierung wird tatsächlich vererbt (funktioniert aber nur mit maven3)

Bitte sehen Sie sich ... andaddy2.zip angehängt anMNG-5127

Dies ist weitaus besser als die Verwendung der Build-Erweiterungsstrategie, da die Verwendung eines Profils mehr Flexibilität bietet als nur das Ändern einiger Ausführungsphasen von Plugins.

Update 2

Kennt jemand eine Build-Erweiterung, die dabei hilft?

Ich bin mir ziemlich sicher, dass es keinen gibt

Eigentlich ist da was!

Es ist als Projekt in angehängtMNG-5102 (von Maurizio Pillitu) Ich habe es nicht getestet, aber es scheint, dass es der vorgeschlagenen Build-Erweiterung sehr nahe kommt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage