Frage

Ist es möglich, ein Plugin in der übergeordneten POM definiert zu haben, die deaktiviert wird, und wenn das Kind dieses Plugin erbt wird es automatisch aktiviert?

War es hilfreich?

Lösung

Ich denke, das Plugin in Ihrer Eltern pom konfigurieren möchten, aber es nur in den vererbten Projekten verwenden. Maven hat einen Abschnitt für diese - konfigurieren Sie Ihre Plugins in pluginManagement, sondern sie in eine Phase binden nur, wenn Sie benötigt es, z.B. lassen Sie den Phase-Tag in pluginManagement, sondern gibt es unter in Sie geerbt pom.

Andere Tipps

So 'siddhadev' ist genau richtig. Sie können die Plugin-Konfiguration in den Eltern pom mit einer bestimmten ID definieren:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>child-caller</id>
                        <!-- 'phase' omitted -->
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo message="called from child!" />
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Und in dem Kind POM, können Sie explizit die Phase aufzuzählen, in denen dies sollte aufgerufen werden:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>child-caller</id>
                    <phase>compile</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Ich habe dies für die Ausrichtung verschiedene JREs verwendet. Leider, weil Sie nicht die Maven-Compiler-Plugin mit verschiedenen Zielverzeichnisse verwenden können (was ich einen Fehler im Plugin betrachten), müssen Sie Ant verwenden.

Dies ist nicht genau das, was Sie wollen, aber ich denke, es ist für Sie gut genug, um zu arbeiten.

Wenn Sie das Plugin in einem pluginManagement-Tag in den Eltern erklären, wird die Konfiguration von untergeordneten Projekten vererbt werden, die dieses Plugin erklären.

Zum Beispiel, in den Eltern erklären, dass die Kompilierung Plugin verwendet Java 5 für Testzusammenstellung.

<pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>test-compile</id>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration>
            <source>1.5</source>
            <target>1.5</target>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</pluginManagement>

Dann in einem Kind, du einfach declare die Compiler-Plugin und die Konfiguration von dem Elternteil vererbt werden:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
    </plugin>
  </plugins>
</build>

Sie können ein Plugin auf der obersten Ebene pom erklären und sagen, es übersprungenen zu sein, und dann sagen, dass es nicht auf dem Kind Ebene übersprungen werden. Es ist nicht ganz automatisch, aber sehr minimal in der Überschreibung Ausführlichkeit.

Eltern Pom, deaktivieren Sie das Plugin, aber erklärt, alle config:

<plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-surefire-plugin</artifactid>
    <configuration>
        <skip>true</skip>
        ...lots more config...
        ...lots more config...
        ...lots more config...
    </configuration>
</plugin>

Child Pom, so dass das Plugin:

<plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-surefire-plugin</artifactid>
    <configuration>
        <skip>false</skip>
    </configuration>
</plugin>

Ich ging mit folgenden Lösung:

  • Konfigurieren Sie das Plugin in den Eltern-pom im pluginManagement Schnitt. Binden Sie das Plug-in eine bestehende Phase.

  • Deaktivieren Sie das Plugin für die Eltern-pom, indem sie es auf eine nicht vorhandene Phasenbindungs. Überschreiben Sie die Phase im Plugins-Sektion

  • Aktivieren Sie das Plugin in jedem Kind-pom durch das Plugin im Plugins Abschnitt enthält.

Beispiel Eltern-pom:

<defaultGoal>install</defaultGoal>
    <pluginManagement>
        <plugins>
            ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <executions>
                    <execution>
                        <id>install-ejb-client</id>
                        <phase>install</phase>
                        <goals>
                        <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <file>${ejb-client-file}</file>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>${project.artifactId}</artifactId>
                            <version>${project.version}</version>
                            <packaging>jar</packaging>
                            <classifier>client</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
                    ...                 
        </plugins>
    </pluginManagement>
    <plugins>
            <plugin>
                <!-- deactivate the plugin for this project, only child-projects do generate ejb-clients -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <inherited>false</inherited>
                <executions>
                    <execution>
                        <id>install-ejb-client</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>
            ...
    </plugins>
</build>

Beispiel Kinder pom:

<build>
    <plugins>
            ...
        <plugin>
            <!-- Install the generated client-jar. Property 'ejb-client-file' has to be set! Plugin configuration is in the parent pom -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
        </plugin>       
            ... 
    </plugins>
</build>

Soweit ich weiß, gibt es keine allgemeine Lösung. Zumindest für den Moment ...

Eine Idee (ich habe es nicht versuchen, aber es kann funktionieren) ist, in der übergeordneten pom.xml ein Ausführungs Ziel zu definieren, die zum Beispiel nicht existiert:

<executions>
    <execution>
        <goals>
            <goal>noGoal</goal>
        </goals>
    </execution>
</executions>

und in jedem Kind, definieren Sie ein richtiges Ziel.

Das Problem dieser Lösung (wenn es funktioniert, natürlich;)) ist, dass Sie die Plugin-Konfiguration für jedes Kind neu definieren müssen. Ansonsten wird es nicht ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top