Pytanie Importuj konfigurację wtyczki maven przez skład, a nie dziedziczenie. Czy można to zrobić z rozszerzeniami kompilacji?


Importuj konfigurację wtyczki maven przez skład, a nie dziedziczenie. Czy można to zrobić z rozszerzeniami kompilacji?

Używam maven przez ponad 3 lata i jest jedna wada, która zawsze mnie podsłuchiwała. Czas już znaleźć rozwiązanie tego problemu.

Problem:

Mam moduł "tatusia" maven z 3 dziećmi: "boy", "girl" i "kid". Każde z tych dzieci musi mieć własny, odrębny zestaw konfiguracji wtyczek dla domyślnej kompilacji "czystej instalacji". Nie chcę tego konfigurować na pomach dla dzieci. Wolałbym umieścić to gdzieś, co mogę później wykorzystać.

Próbowałem używać profili do tego, i to nie działa - proszę zobaczyć mój komentarz i załączony projekt MNG-5127

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

1) Na pomadce tatusia, Zastąpiono [profile] egzekucjami pluginów mającymi [faza] 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) Na tej samej 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 wykonywania 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łu potomnego musi tylko zdefiniować właściwość, która powie rozszerzenie kompilacji, co zrobić, na przykład projekt dla 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łanie instalacji mvn clean na projekcie taty takim jak ten, przyniesie pożądany rezultat: chłopcy będą chłopcami, dziewczęta będą dziewczętami i oboje będą dziećmi.

Pytanie brzmi: czy możemy zrobić lepiej?

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

Istnieje wiele dostępnych wtyczek, ale nie widzę wielu (w rzeczywistości żadnych) dostępnych rozszerzeń kompilacji, które można podłączyć do kompilacji. Czy ktoś wie o rozszerzeniu kompilacji, które pomaga w tym?


Aktualizacja

To nie jest aktualna odpowiedź, ale jest to faktyczne rozwiązanie mojego problemu, więc oto idzie.

Importuj konfigurację wtyczki maven przez skład, a nie dziedziczenie. Czy można to zrobić z rozszerzeniami kompilacji?

Prawdopodobnie

Czy ktoś wie o rozszerzeniu kompilacji, które pomaga w tym?

Jestem prawie pewien, że nie ma

Istnieje jednak rozwiązanie wykorzystujące profile.

Sztuczka polega na tym Aktywacja profilu na podstawie pliku jest faktycznie dziedziczona (działa tylko z maven3)

Zobacz daddy2.zip załączonym do MNG-5127

Jest to o wiele lepsze rozwiązanie niż strategia rozszerzenia kompilacji, ponieważ korzystanie z profilu zapewnia większą elastyczność niż tylko zmiana kilku faz wykonywania wtyczek.


Zaktualizuj 2

Czy ktoś wie o rozszerzeniu kompilacji, które pomaga w tym?

Jestem prawie pewien, że nie ma

Właściwie jest coś!

Jest dołączony jako projekt w MNG-5102 (autor: Maurizio Pillitu) Nie testowałem tego, ale wygląda na to, że robi coś bardzo zbliżonego do proponowanego rozszerzenia kompilacji.


12
2017-07-31 21:36


pochodzenie


Brak odpowiedzi do tej pory, to niepokojące ... Przynajmniej dobrze wiedzieć nie jestem sam. - Tony Lâmpada
Życzenie w Maven 3.1 to "mixins" (jira.codehaus.org/browse/MNG-5102). Brzmi bardzo podobnie do tego, czego szukasz. Niestety nie wydaje się, aby wiele się działo dla Mavena 3.1; Lista problemów wygląda mniej więcej tak, jak przed rokiem. :-( - user944849
W rzeczy samej. Chciałbym, jeśli Freedom Sponsors może pomóc to poprawić :-) - Tony Lâmpada
Naprawdę straciłem nadzieję na odpowiedź na to pytanie. Ale najwyraźniej trwają przygotowania! TO JEST NIESAMOWITE! -> twitter.com/maoo/status/230704704668192768 - Tony Lâmpada


Odpowiedzi:


Myślę, że Płytki Maven może ci pomóc w konkretnym przypadku użycia. Nadal trwają prace, ale obecnie osiąga to, co opisujesz, udało mi się "rozłożyć" furtka-szybki start i uruchom mola, nawet dodając strukturę wielomodułową.

Każdy komentarz lub podpowiedź jest więcej niż mile widziany. Dzięki,   Maurizio


6
2017-08-06 13:23



Teraz, gdy 0.8-beta-6 jest na zewnątrz, dodałem daddy3.zip plik do MNG-5102 to pokazuje, jak z niego korzystać. - Tony Lâmpada
Stabilny 2.8 od kwietnia 2016 - Paul Verest
Dlaczego <dependencies> nie można dodać do płytki i jak zaimportować konfigurację zależności? (Błąd mówi: Tile zawiera zależności - to uniemożliwi konsumentom dodawanie wykluczeń, zamiast tego używaj kompozytów). - fwonce