2012-04-12 12 views
5

Estoy construyendo un proyecto de aplicación web usando maven, y el embalaje está configurado en "guerra". También uso el complemento compresor YUI para comprimir códigos JavaScript en el directorio de aplicaciones web. He configurado el compresor YUI así:Archivos sobrescritos en el proyecto maven al construir una guerra

<plugin> 
    <groupId>net.alchim31.maven</groupId> 
    <artifactId>yuicompressor-maven-plugin</artifactId> 
    <version>1.3.0</version> 
    <executions> 
     <execution> 
     <phase>process-resources</phase> 
     <goals> 
      <goal>compress</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <excludes> 
     <exclude>**/ext-2.0/**/*.js</exclude> 
     <exclude>**/lang/*.js</exclude> 
     <exclude>**/javascripts/flot/*.js</exclude> 
     <exclude>**/javascripts/jqplot/*.js</exclude> 
     </excludes> 
     <nosuffix>true</nosuffix> 
     <force>true</force> 
     <jswarn>false</jswarn> 
    </configuration> 
</plugin> 

Si hago: proceso de recursos MVN, src/main/webapp conseguiré copiado para apuntar/webapp-1.0/directorio y javacripts se comprimen. Sin embargo, cuando ejecuto mvn install, todos los javascripts comprimidos se sobrescriben, aparentemente el proceso de empaquetado copia el contenido de main/webapp una vez antes de compilar el archivo war.

¿Cómo puedo evitar esto?

Respuesta

10

Como habrá notado, la /src/main/webapp dir (también conocido como warSourceDirectory) contenido no se copia en el directorio de proyecto para el embalaje hasta el plugin guerra ejecuta durante la fase de paquete. Cuando el complemento de guerra se completa, el archivo ya está creado; demasiado tarde para modificar esos recursos. Si los archivos .js que desea comprimir se movieron a otro directorio (fuera de /src/main/webapp), entonces podría hacer algo como el siguiente.

Para probar, creé un directorio ${basedir}/src/play con un par de archivos en él. Usé el complemento resource para el ejemplo; reemplazarías esa configuración con la configuración del complemento del compresor YUI que necesitabas y simplemente agregarías el elemento <webResource> a tu configuración de complemento war como se muestra a continuación; más información en el war plugin examples. Mi guerra terminó con los archivos adicionales justo donde los quería.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>copy-resources</id> 
     <phase>process-resources</phase> 
     <goals><goal>copy-resources</goal></goals> 
     <configuration> 
     <outputDirectory>${project.build.directory}/tmpPlay</outputDirectory> 
     <resources> 
      <resource> 
      <directory>${project.basedir}/src/play</directory> 
      <includes> 
       <include>**/*</include> 
      </includes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>default-war</id> 
     <configuration> 
     <webResources> 
      <resource> 
      <directory>${project.build.directory}/tmpPlay</directory> 
      <targetPath>WEB-INF/yourLocationHere</targetPath> 
      <includes> 
       <include>**/*</include> 
      </includes> 
      </resource> 
     </webResources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
0

en su directiva de ejecución, establezca la fase para aplicar su compresión y copia para instalar y que con suerte lo solucionará. el código debe ser algo como esto:

<executions> 
    <execution> 
     .... 
     <phase>install</phase> 
     .... 
    </execution> 
<executions> 
+0

que va a ser demasiado tarde, incluso intenté paquete, el archivo war creado no tiene los códigos javascript comprimidos. –

+0

¿Qué sucede si agrega una directiva de fase a su complemento de guerra y lo establece en 'paquete' o' instalar' mientras establece la fase para su compresión en 'prepare-package'? básicamente asegurando que la creación de la guerra ocurre después de comprimir los archivos * .js? – nemo

4

Creo que @ user944849 respuesta es la respuesta correcta, al menos en una de las respuestas correctas. Otra forma de archivar esto es excluir la modificación Javascript directorio de configuración experta en la guerra-plugin, por ejemplo:

<plugin> 
    <artifactId> maven-war-plugin </artifactId> 
    <configuration> 
     <warSourceExcludes>**/external/ dojo/**/*.js </warSourceExcludes> 
    </configuration> 
</plugin> 

esto le dirá experto en la guerra-plugin no copiar desde el directorio excluido, pero dado que el Javascript modificado El directorio ya está allí, el archivo war aún contiene el directorio javascript, PERO con los códigos modificados, en este caso, javascript comprimidos.

+0

esto funcionó para mí .. :) – Venky

0

Aquí está mi solución, basta con añadir un plugin antRun que actualiza el archivo de la guerra empaquetado utilizando las salidas procesadas, que se une a la fase de paquete:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>package</id> 
        <phase>package</phase> 
        <configuration> 
         <target> 
          <zip basedir="${project.build.directory}/${project.build.finalName}" 
           destfile="${project.build.directory}/${project.build.finalName}.war" 
           update="true"> 
          </zip> 
         </target> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
Cuestiones relacionadas