2009-10-26 12 views
52

En un proyecto de varios módulos, ¿cómo puede especificar que desea ejecutar un objetivo de complemento en todos los módulos hijo, pero no en el proyecto principal? Hay <pluginManagement>, pero que sólo define la configuración de la ejecución - los módulos niño aún necesitarían para hacer referencia al plugin para conseguir el objetivo ejecutado:Ejecutar el objetivo de complemento Maven en módulos secundarios, pero no en el padre

[...] Sin embargo, esto sólo se configura plugins que son hecho referencia en el elemento de complementos en los niños. (POM Reference)

Cualquier otra forma de lograr esto?

ACTUALIZACIÓN: he intentado esto de acuerdo con el consejo de Pascal:

<!-- ... --> 
<packaging>pom</packaging> 
<modules> 
    <module>child</module> 
</modules> 

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 
<!-- ... --> 

Esto todavía va a generar un .jar para el proyecto principal, a pesar de que el objetivo jar se une a la fase integration-test.

+1

no puedes obligar a éste a una fase que no se ejecuta en un proyecto de tipo POM (que su padre debe ser ?) – falstro

+0

@roe Creo que su comentario podría convertirse en una respuesta :-) Me gustaría saber, y yo votaría por él ;-) – KLE

+0

@KLE No fue una respuesta, estaba tratando de ayudar a la lluvia de ideas. No tengo idea de cómo hacer esto. – falstro

Respuesta

23

De acuerdo con la Default Lifecycle Bindings, las fijaciones para un embalaje pom son:

defecto del ciclo de vida Vinculaciones - Embalaje pom

 
package  site:attach-descriptor 
install  install:install 
deploy  deploy:deploy 

Así que si su POM padre tiene una <packaging>pom<packaging> (este debería ser el caso como se señala en un comentario) y si se une sus complementos a otras fases diferentes a las anteriores (consulte Lifecycle Reference para obtener una lista completa), no se ejecutarán durante la compilación del POM principal.

(EDIT: Mi respuesta inicial es simplemente incorrecto Si enlaza un objetivo plugin para una fase particular, se desencadenó durante esa fase, independientemente del envase del proyecto El Default Lifecycle Bindings no tienen nada.. para hacer con eso, son solo enlaces de ciclo de vida predeterminados. Todo lo que importa es si la fase a la que está vinculado el complemento es parte del build lifecyle).

Como ya lo señaló, puede usar el pluginManagement en el pom padre para la configuración del complemento, pero si realmente desea ejecutar un objetivo de complemento en módulos secundarios y no en el padre (es posible que tenga buenas razones para hacerlo pero la mayoría de las veces, los complementos no tendrán mucho efecto en un módulo con un paquete pom que no tiene ningún contenido), tendrá que hacer referencia a los complementos en el elemento plugins en los elementos secundarios.

aplicado a su ejemplo, el pom.xml padres podrían definir las siguientes especificaciones:

<project> 
    <packaging>pom</packaging> 
    ... 
    <modules> 
    <module>child</module> 
    </modules> 
    ... 
    <build> 
    <pluginManagement> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
      <execution> 
       <id>my-execution-id</id> 
       <phase>integration-test</phase> 
       <goals> 
       <goal>jar</goal> 
       </goals> 
      </execution> 
      </executions> 
     </plugin> 
     ... 
     </plugins> 
    </pluginManagement> 
    </build> 
    ... 
</project> 

Y en cada niño pom.xml, sólo se requiere lo siguiente:

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     </plugin> 
    </plugins> 
    ... 
    </build> 
</project> 
+1

La respuesta de Pascal es correcta. En el padre POM, la sección '' define la conifugración para los complementos pero no obliga a sus ejecuciones, también debe colocar la sección '' para extender las excuciones de estos complementos a los módulos secundarios. – cetnar

+0

He intentado esto con el 'maven-jar-plugin', pero todavía crea un .jar para mi proyecto padre POM. Añadiré detalles a la pregunta. –

+0

Gracias, funcionó para mí. –

15

La solución descrita con la administración de complementos es ciertamente correcta, pero en ciertos casos no encaja.Supongamos que desea ejecutar varios objetivos jar: jar en el módulo secundario, cada uno configurado con su propia configuración (configuración) por ejecución. O, en general, cuando no quiere obligar a los poms de los niños a activar explícitamente los complementos.

En este caso la solución que funcionó para mí fue definir las ejecuciones en el pom padre bajo un perfil específico, y tienen que activarse sólo en poms del niño, por ejemplo, mediante la comprobación de la existencia de algún archivo o la propiedad:

<profile> 
    <id>generate-dc</id> 
    <activation> 
     <file> 
      <exists>src/main/assembly/some.xml</exists> 
     </file> 
    </activation> 

Luego, los complementos no se ejecutarán en el elemento principal, pero se ejecutarán en todos los elementos secundarios si contienen el archivo o configuran alguna propiedad.

+0

Esto ciertamente no es bonito, pero es el único trabajo que he encontrado para hacer esto. Sin embargo, sugeriría usar una propiedad de entorno como $ {project.name} o $ {pom.name} para activar la activación en lugar del archivo, pero es una cuestión caso por caso, por supuesto. – Miquel

+0

Ha, esta sugerencia me llevó a la única solución para los segmentos Maven mixtos "compuestos" adecuados. Haga los archivos de selector de perfil vacíos. Es horrible, pero podría ser peor. – Reinderien

+1

¡Una gran solución para la ejecución condicional de complementos, salvó mi día! –

8

Tuve el requisito similar de ejecutar algunos complementos en el secundario pero no en el POM principal. Lo logré indicando <skip>true</skip> en el POM padre.

La entrada pom padre es el siguiente: entrada pom

<plugin> 
    <groupId>eviware</groupId> 
    <artifactId>maven-soapui-plugin</artifactId> 
    <version>4.0.0</version> 
    <inherited>false</inherited> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
     </dependency> 
    </dependencies> 
    <configuration> 
     <skip>true</skip> 
    </configuration> 
</plugin> 

El proyecto niño está por debajo

<plugins> 
    <plugin> 
     <groupId>eviware</groupId> 
     <artifactId>maven-soapui-plugin</artifactId> 
     <version>4.0.0</version> 
     <configuration> 
      <settingsFile>site-service-web/src/test/soapui/soapui-settings.xml</settingsFile> 
      <projectFile>site-service-web/src/test/soapui/PodifiSite-soapui-project.xml</projectFile> 
      <outputFolder>site-service-web/target/surefire-reports</outputFolder> 
      <junitReport>true</junitReport> 
      <exportwAll>true</exportwAll> 
      <printReport>true</printReport> 
     </configuration> 
    </plugin> 
</plugins> 
+0

Advertencia: la configuración anterior podría funcionar pero en casos complejos en que otros pom heredan el elemento principal y específicamente el complemento que se definió como salto verdadero, tendrá un problema ya que el complemento NO se ejecutará, a menos que lo defina o configure . Para complementos raramente usados, usted desea cualquier problema, pero para complementos como maven-resources-plugin, el salto predeterminado true podría ser un problema – javapapo

+0

Esto funcionó para mí. Aunque el complemento que necesitaba usar, appassembler, en realidad no se salta, simplemente puse una configuración de marcador de posición en el POM de nivel superior y mis módulos secundarios comenzaron a ejecutar correctamente el objetivo del appassembler. ¡Gracias! :) –

0

Probé la respuesta de Pascal, pero no funcionó para mí. Los complementos a los que se hace referencia en el pom hijo no se ejecutaron, lo asumo porque no tenían un enlace de fase de compilación.

El puesto que aquí se describe una solución que funciona mediante la unión de los complementos a los identificadores de ejecución y construyo fases: How to override default binding to phase of a Maven plugin

te recomiendo que a cualquier otra persona tratando de conseguir este trabajo.

0

Use <inherited>false</inherited> en la sección de complementos en el proyecto principal.

Plese consulte this page para obtener más información.

0

Esta configuración inferior funcionó para mí. Agregue el complemento tanto en el pom principal como en el secundario.

Padres:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <inherited>true</inherited> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <skip>true</skip> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

Niño

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <inherited>false</inherited> 
     <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <skip>false</skip> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
Cuestiones relacionadas