2011-10-17 14 views
36

Tengo un proyecto multi-módulo maven (chico, he escrito que la apertura manera muchas veces en este sitio). Casi todos los módulos (es decir, los que tienen código en ellos) deben ejecutar el maven-site-plugin para generar informes sobre la cobertura del código, etc. Estos tienen una configuración compartida detallada, que informa para ejecutar, qué archivos para cubrir/excluir para ciertos complementos, etc.En un proyecto de varios módulos Maven, ¿cómo puedo desactivar un complemento en un elemento secundario?

Sin embargo, hay algunos módulos que se ocupan del empaquetado: ejecutar el plugin de ensamblaje para generar un tarball, etc. No obtienen nada al ejecutar un informe del sitio; no hay código para analizar, no hay pruebas para informar.

Así que tienen una gran cantidad de módulos que deben configuración del plugin cuota de, y unos módulos que necesitan no ejecutar el complemento de, preferiblemente en absoluto. Puedo hacer lo anterior (compartir configuración) si coloco el complemento en la sección <build> del POM principal, pero parece que no puedo desactivar el complemento cuando lo necesito en este caso. Puedo hacer esto último (evitar ejecutar el complemento) si presiono la configuración hacia el propio POM de cada módulo, pero no puedo encontrar una buena manera de compartir la información de configuración en este caso.

Es lo que quiero - ¿la configuración compartida, para un complemento que algunas veces está deshabilitado por un módulo secundario? ¿Es posible? ¿Si es así, cómo?

Respuesta

61

Con "ejecutar el complemento", supongo que quiere decir que el complemento está vinculado a una fase del ciclo de vida, y le gustaría desvincularlo en algunos módulos. Primero, podría considerar cambiar su herencia de POM para que los módulos que no necesitan los complementos tengan un padre y los que sí lo tengan. Si no quiere hacer eso, entonces puede establecer explícitamente la fase de ejecución en "nada" en un módulo secundario. P.ej. si tuviera una configuración pom padres así:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase>initialize</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       ... lots of configuration 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Luego, en un módulo de niño, usted puede hacer esto:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase/> 
     </execution> 
    </executions> 
</plugin> 

Debido a que es el mismo plugin y el mismo ID de ejecución, se anula la configuración especificado en el elemento primario, y ahora el complemento no está vinculado a una fase en el proyecto secundario.

+1

Impresionante, sabía que sería algo así, pero todavía soy una especie de cinturón amarillo (en caso de que no hayas adivinado el rastro de las preguntas de Maven en mi historia reciente). No puedo mover los proyectos a diferentes padres debido a [esto] (http://stackoverflow.com/questions/7589931/how-should-i-share-maven-depdendencymanagement-from-multiple-sources), pero lo haré desvincular el complemento de informe. ¡Gracias! – Coderer

+4

Este enfoque no funciona si no hay '' especificado para el complemento en el módulo principal. – EvgeniySharapov

+5

@evgeniysharapov Todavía puede usar ' none' en el módulo secundario en ese caso, vea [esta respuesta] (http://stackoverflow.com/a/14653088/1155724). –

1

La respuesta de Ryan Stewart funciona si la ejecución que desea suprimir en el padre pom está etiquetada con un id. Sin embargo, si el pom padre no etiqueta la ejecución con un id (y, por supuesto, no puede editar ese pom padre) entonces descubrí que al hacer lo siguiente se suprime la acción del pom padre.

  1. primer conjunto de la fase de la ejecución de none
  2. Crear otra ejecución, darle un id y hacer en ella lo que necesita hacer.
  3. ejecuta mvn help:effective-pom para confirmar que ha suprimido correctamente lo que necesita suprimido del pom principal.

He aquí un ejemplo: Así es como mi padre parecía pom:

<plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.1.2</version> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>jar</goal> 
      </goals> 
     </execution> 
     </executions> 
     <inherited>true</inherited> 
    </plugin> 

que tenía que cambiar el objetivo de jar-no-fork.Tenga en cuenta que la ejecución en parent pom no tiene un id que podría usar para deshabilitarlo. Así que esto es lo que añadió a mi pom del niño:

  <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-source-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>none</phase> 
        </execution> 
        <execution> 
         <id>attach-sources</id> 
         <goals> 
          <goal>jar-no-fork</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

Como resultado así es como el efectivo-pom parece:

 <plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.2.1</version> 
     <executions> 
      <execution> 
      <phase>none</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
      <execution> 
      <id>attach-sources</id> 
      <goals> 
       <goal>jar-no-fork</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
     </executions> 
     <inherited>true</inherited> 
     <configuration> 
      <archive> 
      <compress>false</compress> 
      </archive> 
     </configuration> 
     </plugin> 

Esto aseguró que el objetivo jar nunca se acaba y sólo los meta jar-no-fork ejecuta - que es lo que quería lograr.

Cuestiones relacionadas