Importuj konfigurację wtyczki Maven według składu, a nie dziedziczenia. Czy można to zrobić za pomocą rozszerzeń budowania?

Importuj konfigurację wtyczki Maven według składu, a nie dziedziczenia. Czy można to zrobić za pomocą rozszerzeń budowania?

Używałem maven od ponad 3 lat i jest jedna wada, która zawsze mnie wkurza. Czas już znaleźć rozwiązanie tego problemu.

Problem:

Mam moduł „tatusia” z trzema dziećmi: „chłopcem”, „dziewczyną” i „dzieckiem”. Każde z tych dzieci musi mieć swój własny zestaw konfiguracji wtyczek dla domyślnej kompilacji „czystej instalacji”. Nie chcę umieszczać tej konfiguracji na dziecięcych pomsach. Wolę umieścić to gdzieś, że będę mógł je później wykorzystać.

Próbowałem użyć do tego profili i to nie działa - zobacz mój komentarz i dołączony projektMNG-5127

Znalazłem lepsze rozwiązanie, wprowadzając następujące zmiany wtatuś.zip projekt:

1) Na pomacie tatusia, Zastąpiłem [profile] wykonaniami wtyczek mającymi [fazę] brak [/ faza]

<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) W tym samym pom dodano niestandardowe rozszerzenie kompilacji

<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) Rozszerzenie zmieni fazy wykonania wtyczki na podstawie wartości właściwości projektu. Kod Java poniżej.

@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 moduły potomnej muszą tylko zdefiniować właściwość, która powie rozszerzenie kompilacji, co robić, na przykład projekt chłopca:

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

Wywoływanie mvn clean install w projekcie taty, takim jak ten, przyniesie pożądany rezultat: chłopcy będą chłopcami, dziewczyny będą dziewczętami, a obie będą dziećmi.

Pytanie brzmi: czy możemy zrobić lepiej?

Teoretycznie rozszerzenie kompilacji może importować definicje konfiguracji kompilacji dla chłopca, dziewczynki i dzieciaka z różnych poms ... prawda? Byłby to sprytny i elegancki sposób importowania konfiguracji [build] do pom.

Istnieje wiele dostępnych wtyczek maven, ale nie widzę zbyt wielu (właściwie żadnych) dostępnych rozszerzeń kompilacji, które można podłączyć do kompilacji. Czy ktoś zna rozszerzenie kompilacji, które pomaga w tym?

Aktualizacja

To nie jest rzeczywista odpowiedź, ale jest to rzeczywiste rozwiązanie mojego problemu, więc tutaj idzie.

Importuj konfigurację wtyczki Maven według składu, a nie dziedziczenia. Czy można to zrobić za pomocą rozszerzeń budowania?

Prawdopodobnie

Czy ktoś zna rozszerzenie kompilacji, które pomaga w tym?

Jestem pewien, że nie ma takiego

Istnieje jednak rozwiązanie wykorzystujące profile.

Sztuka polega na tymaktywacja profilu oparta na plikach jest dziedziczona (działa tylko z maven3)

Proszę zobaczyćtata2.zip załączonym doMNG-5127

Jest to o wiele lepsze niż użycie strategii rozszerzenia kompilacji, ponieważ użycie profilu zapewnia większą elastyczność niż tylko zmiana kilku faz wykonania wtyczki.

Aktualizacja 2

Czy ktoś zna rozszerzenie kompilacji, które pomaga w tym?

Jestem pewien, że nie ma takiego

Właściwie jest coś!

Jest dołączony jako projekt wMNG-5102 (autorstwa Maurizio Pillitu) Nie testowałem tego, ale wydaje się, że robi coś bardzo zbliżonego do proponowanego rozszerzenia kompilacji.

questionAnswers(1)

yourAnswerToTheQuestion