2008-12-09 17 views
45

Tengo un Maven pom que usa <packaging>war</packaging>. Pero en realidad, no quiero compilar el archivo war, solo quiero que se recopilen todos los jars dependientes y se cree un directorio completo de implementación.Cómo hacer que Maven ejecute la guerra: explotó pero no la guerra: guerra

Así que estoy corriendo el objetivo war:exploded para generar el directorio de despliegue:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <configuration> 
       <webappDirectory>target/${env}/deploy</webappDirectory> 
       <archiveClasses>true</archiveClasses> 
      </configuration> 
      <goals> 
       <goal>exploded</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

El problema es que el archivo de la guerra todavía se construye. ¿Hay una manera simple de tener <packaging>war</packaging> ejecutar el objetivo war:exploded en lugar de la guerra: objetivo de guerra?

¿O hay otra manera simple de hacer esto?

+1

El archivo war todavía se crea, ¿y qué? ¿Por que eso es un problema? –

+4

Supongo que es porque quieren acelerar la compilación, al menos es por eso que estoy usando esto. Tengo una aplicación básica de primavera con maven, pero estoy trabajando con Google App Engine, que está configurado para escanear el directorio de compilación de guerra, para que yo pueda ver los cambios. Necesito construir la guerra explosiva, a menudo. ¿Alguna forma de invocar esto automáticamente cada vez que se cambian los archivos en el proyecto? – chrismarx

Respuesta

40

Según builtin lifecycle bindings para el envasado de guerra en guerra fase de paquete: mojo guerra se llama.

Puede llamar fase anterior 'prepare-paquete' - todas las acciones se llevarán a cabo y después de que la guerra llamada mojo: estallado

mvn prepare-package war:exploded 

Los resultados serán los mismos que los suyos, pero no a la guerra creada.

+1

Si realmente te gusta esto, puedes poner la invocación war: explosion en el pom vinculado a la fase de preparación del paquete. Pero tendrá un problema si alguna vez necesita maven para seguir adelante y ejecutar el resto de las fases, por lo que cambiar a < embalaje> pom es mejor. – bmargulies

+0

Encontré esto falló en el mío porque está tratando de hacer un FileInputStream.open en la carpeta 'classes'. Sin embargo, funcionando como dos comandos separados funcionó 'mvn prepare-package' y luego' mvn war: explded' ah maven you mysterious bestia –

+0

esto no funciona si tienes un proyecto dividido en varios jarrones - necesitarán ser 'install' para ponerlos en el caché estático de maven para que los recoja en la etapa de preparación del paquete. –

5

La única forma en que puedo pensar para hacer lo que quiera es configurar el uso del paquete pom (o crear un custom packaging) y unir los objetivos requeridos de la guerra empaquetado a las fases relevantes del ciclo de vida. Si va por el paquete de pom, puede usar definir war: war execution en un perfil para permitirle empaquetarlo, pero necesitará usar el build-helper-maven-plugin attach-artifact goal para unir la guerra al pom.

Tenga en cuenta que con este enfoque, si desea utilizar cualquier otro proceso específico de guerra, puede causar problemas.

Los enlaces del ciclo de vida para el embalaje de guerra se enumeran en Introduction to The Build Lifecycle (consulte la sección "Enlaces de ciclo de vida predeterminados - Empaquetado ejb/ejb3/jar/par/rar/war").

para unir las ejecuciones de plugin de interés para el envasado de pom que haría de la siguiente manera:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-resources-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>process-resources</id> 
      <phase>process-resources</phase> 
      <goals> 
      <goal>resources</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <artifactId>maven-compile-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>compile</id> 
      <phase>compile</phase> 
      <goals> 
      <goal>compile</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <artifactId>maven-resources-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>process-test-resources</id> 
      <phase>process-test-resources</phase> 
      <goals> 
      <goal>testResources</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>test</id> 
      <phase>test</phase> 
      <goals> 
      <goal>test</goal> 
      </goal> 
     </execution> 
     </executions> 
    </plugin> 
    <!-- package not wanted, install and deploy already defined for pom packaging--> 
    <!--define war:war execution in a profile in case it is needed--> 
+0

Este es el enfoque correcto. – bmargulies

63

La solución es bastante simple. Necesita anular la ejecución por defecto del plugin guerra para desactivarlo y añadir su propia ejecución (por estallado):

<pluginManagement> 
    <plugins> 
      <plugin><!-- don't pack the war --> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>default-war</id> 
         <phase>none</phase> 
        </execution> 
        <execution> 
         <id>war-exploded</id> 
         <phase>package</phase> 
         <goals> 
          <goal>exploded</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
    </plugins> 
</pluginManagement> 
+6

Esta es la solución más simple y fácil publicada aquí. – Ajax

+0

+1 para un enfoque más limpio –

+0

Sí, esta parece ser la mejor respuesta. Funcionó como un encanto para mí. :) –

5

me gustaría actualizar en respuesta @ Michael Wyraz y basta con incluir instalación saltar ajustes en caso si alguien ejecuta mvn clean install compila en el nivel superior del proyecto de multímetro y uno de submódulo es aplicación web.

Este módulo se encuentra dentro de la guerra:

<profiles> 
    <profile> 
     <id>war_explode</id> 
     <build> 
      <pluginManagement> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-war-plugin</artifactId> 
         <version>2.6</version> 
         <executions> 
          <execution> 
           <id>default-war</id> 
           <phase>none</phase> 
          </execution> 
          <execution> 
           <id>war-exploded</id> 
           <phase>package</phase> 
           <goals> 
            <goal>exploded</goal> 
           </goals> 
          </execution> 
         </executions> 
        </plugin> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-install-plugin</artifactId> 
         <executions> 
          <execution> 
           <id>default-install</id> 
           <phase>none</phase> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </pluginManagement> 
     </build> 
    </profile> 
</profiles> 

Sin instalación omitir generación falla, ya que trata de instalar la guerra en la carpeta .m2.Mensaje de error es el siguiente:

[INFO] --- maven-install-plugin:2.4:install (default-install) @ *** --- 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-install) on project ***: The packaging for this project did not assign a file to the build artifact -> [Help 1] 

Ejecución mvn clean install -P war_explode con esta opción (entre encerrado en el perfil experto nombrado war_explode) termina a construir sin error.

+1

Si la instalación falla, es correcta porque no hay nada instalado, pero esto es fingir que está hecho. Probablemente sea mejor hacer un perfil para el empaque explosionado y de guerra donde el perfil explotado no se puede instalar correctamente. –

Cuestiones relacionadas