2017-03-31 3 views
1

Ich habe einen Elternteil pom dieseltsames Verhalten mit Maven Plugin-Management mit Maven-todsichere-Plugin

<pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <version>2.19.1</version> 
        <configuration> 
         <parallel>classesAndMethods</parallel> 
         <threadCount>4</threadCount> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

definiert ich ein Kind Projekt, das von der pom erbt, aber nicht das Plugin in seinem Plugin Abschnitt deklariert. Ich sehe immer noch, dass das Plugin wirksam wird, wenn ich maven test goal starte.

+0

Bezieht sich die Pom auf ihre Eltern? Wo führst du MVN? –

+0

ja. Das untergeordnete Projekt bezieht sich auf das übergeordnete Projekt. Ich führe das Maven-Ziel innerhalb des Kind-Modul-Stammordners. – Shibashis

+0

Wenn es sich auf seinen Eltern bezieht, nimmt es Konfiguration von dort auf. –

Antwort

-1

Wenn Maven-todsichere Plugin in dem übergeordneten Projekt definieren siehe : http://maven.apache.org/surefire/maven-surefire-plugin/usage.html

<pluginManagement> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.19.1</version> 
    </plugin> 
    </plugins> 
</pluginManagement> 

Hinzufügen der Konfigurationsabschnitt bewirkt, dass es implizit in jedem der untergeordneten Projekte auszuführen.

Im Kind Projekt die Konfiguration

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <parallel>classesAndMethods</parallel> 
     <threadCount>4</threadCount> 
    </configuration> 
</plugin> 

Auch wenn die Konfiguration in dem Kind Projekt recht ausführliche aussehen wird, dann sorgt es explizite Zugabe der Abhängigkeit und die gleichen Version des Plugins in allen Unter Module.

+0

Nicht sicher, was diese Antwort erklärt. Wenn Sie sagen, dass "Kinderprojekt ziemlich ausführlich ist", sprechen Sie davon, das Plug-in dem Kind manuell hinzuzufügen? Wenn ja, dann sollten Sie dies nicht tun müssen. Sie sollten nicht einmal etwas über das Plugin im untergeordneten Projekt deklarieren müssen. Die gesamte Konfiguration im 'pluginManagement' sollte automatisch vom übergeordneten Element übernommen werden. Und diese Antwort sagt nicht, warum diese Vererbung gemacht wird. – manouti

+0

Jede Konfiguration im Abschnitt 'plugin' wird automatisch übernommen. Jede Konfiguration im 'pluginManagement'-Bereich wird nur hinzugefügt, wenn sie explizit im Plugin-Bereich des untergeordneten Projekts angegeben wurde. Der Vorteil, der die Konfiguration in 'pluginmanagement' definiert, ist die Tatsache, dass alle Untermodule dieselbe Plugin-Version verwenden. – Shibashis

0

Dies ist normal, da die maven-surefire-plugin standardmäßig an die test-Phase als Teil der built-in lifecycle bindings gebunden ist. Es muss nicht im untergeordneten Projekt deklariert werden.

Mit anderen Worten, das Plugin ist implizit für das untergeordnete Projekt verfügbar, weil es sich an die test Phase bindet. Die maven-scm-plugin (in der anderen Frage verknüpft) ist nicht standardmäßig an eine Phase gebunden, so dass Sie es im untergeordneten deklarieren müssen, um die Konfiguration vom übergeordneten zu erben. Aber da maven-surefire-plugin standardmäßig an die Testphase gebunden ist, müssen Sie es nicht im untergeordneten Element deklarieren. Versuchen Sie mvn help:effective-pom in Ihrem Kind-Modul zu laufen, um die effektive POM zu sehen, die das endgültige POM zeigt, das Maven tatsächlich benutzt. Überprüfen Sie http://maven.apache.org/ref/3.3.9/maven-core/default-bindings.html, um die Standard-Plugin-Bindungen zu sehen. Wenn Sie das Plugin überspringen möchten, führen Sie einfach mvn install oder übergeben Sie -DskipTests=true. Wenn Sie noch mvn test müssen, um Tests in anderen Projekten zu laufen, können Sie Tests in dem Child-Moduls POM überspringen (obwohl dies nicht empfohlen wird):

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
       <skipTests>true</skipTests> 
     </configuration> 
    </plugin> 
</plugins> 
+0

Können Sie bitte die beiden Kommentare, die ich zu der Frage hinzugefügt habe? – Shibashis

+0

@Shibashis Das Beispiel in der verknüpften Frage enthält ein Plug-in, das im Child deklariert werden soll. Für Plugins wie 'maven-surefire-plugin' und' maven-jar-plugin' sind sie jedoch bereits standardmäßig zum Erstellen von Phasen verpflichtet. Ich würde sagen, dass die Dokumentation verbessert werden könnte, um diese Notiz hinzuzufügen. Um dies auch zu bestätigen, erwähnt das [plugin's doc] (http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html) folgendes: "Wird standardmäßig an die Lebenszyklusphase gebunden: test." – manouti

+0

Ich verstehe das Plugin bindet sich an die Testphase. Aber meine Frage ist, warum das Plugin im Kindprojekt implizit verfügbar wird. – Shibashis