Pregunta

¿Es posible tener un complemento definido en el POM principal que está desactivado, y cuando el hijo hereda este complemento se activa automáticamente?

¿Fue útil?

Solución

Supongo que desea configurar el complemento en su pom padre, pero úselo solo en los proyectos heredados. Maven tiene una sección para esto: configure sus complementos en pluginManagement, pero agrúpelos a una fase justo cuando lo necesite, p. omita la etiqueta de fase en pluginManagement, pero especifíquela en pom heredado.

Otros consejos

Entonces 'siddhadev' es exactamente correcto. Puede definir la configuración del complemento en el pom padre con una identificación determinada:

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

Y, en el POM secundario, puede enumerar explícitamente la fase en la que debería llamarse:

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

He usado esto para apuntar a varios JRE. Desafortunadamente, debido a que no puede usar el complemento maven-compiler con diferentes directorios de destino (lo que considero un error en el complemento), debe usar Ant.

Esto no es exactamente lo que busca, pero creo que funcionará lo suficientemente bien para usted.

Si declara el complemento en una etiqueta pluginManagement en el elemento primario, cualquier proyecto secundario que declare ese complemento heredará la configuración.

Por ejemplo, en el padre declare que el complemento de compilación usa Java 5 para la compilación de prueba.

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

Luego, en un elemento secundario, simplemente declara el complemento del compilador y la configuración del elemento primario se heredará:

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

Puede declarar un complemento en el pom de nivel superior y decirle que se omita y luego decirle que no se omita en el nivel secundario. No es del todo automático, pero es muy mínimo en la verbosidad de anulación.

Parent Pom, deshabilitando el complemento, pero declarando toda la configuración:

<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, habilitando el complemento:

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

Fui con la siguiente solución:

  • Configure el complemento en el padre-pom en la sección pluginManagement-section. Enlace el complemento a una fase existente.

  • Desactive el complemento para el padre-pom al vincularlo a una fase inexistente: anule la fase en la sección de complementos.

  • Active el complemento en cada child-pom incluyendo el complemento en la sección de complementos.

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

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

Hasta donde yo sé, no hay una solución genérica para esto. Al menos por el momento ...

Una idea (no lo intenté, pero puede funcionar) es definir, en el pom.xml padre, un objetivo de ejecución que no existe, por ejemplo:

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

y en cada niño, redefine un objetivo correcto.

El problema de esta solución (si funciona, por supuesto;)) es que debe redefinir la configuración del complemento para cada niño. De lo contrario, no se ejecutará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top