2011-01-11 14 views
19

Tengo un proyecto web creado con Maven y estoy tratando de encontrar la mejor manera de compilar los archivos JavaScript con el compilador RequireJS (esta pregunta podría aplicarse a cualquier compilador/minificador también).Recopilación RequireJS en el proyecto Maven con dependencias JS externas

que tienen una configuración que funciona, pero necesita mejoras:

He envasados, las bibliotecas de JavaScript de 3 ª parte y se descargan como dependencias y luego agregó con el plugin GUERRA superposición.

Tengo una tarea de complemento Exec que ejecuta el compilador RequireJS dentro del directorio de destino. Actualmente, ejecuto manualmente exec:exec después de que se ejecute el destino del paquete (y, por lo tanto, los contenidos de WAR se colocan en el directorio de destino).

Lo que me gustaría en cambio es hacer que la compilación JS sea parte de la compilación principal (Java). El propio compilador JS (Require JS) se descarga como una dependencia durante la fase de superposición WAR que ocurre después de la compilación. Entonces, necesito que los archivos Require JS se descarguen y desempaqueten y necesito ejecutar la compilación JS usando esos archivos, antes/durante/después de la compilación de Java.

Estoy seguro de que podría haber varias formas de lograrlo. Estoy buscando la solución más elegante.


Actualizar: Existente fragmentos POM

tengo dependencias de JavaScript que he comprimido y añadido a nuestro gestor de repositorio:

<dependency> 
     <groupId>org.requirejs</groupId> 
     <artifactId>requirejs</artifactId> 
     <version>0.22.0</version> 
     <classifier>repackaged</classifier> 
     <type>zip</type> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.jqueryui</groupId> 
     <artifactId>jquery-ui</artifactId> 
     <version>1.8.7</version> 
     <classifier>repackaged</classifier> 
     <type>zip</type> 
     <scope>runtime</scope> 
    </dependency> 

tomar en cuenta que RequireJS en sí (que se requiere para la compilación del resto de bibliotecas) también se carga como una dependencia externa. Entonces, lo primero es que necesito que esta dependencia se descargue y descomprima antes de que pueda comenzar con la compilación RequireJS.

Estas dependencias se añaden a la guerra usando el plugin GUERRA Superposición:

 <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <configuration> 
       <overlays> 
        <overlay> 
         <groupId>org.requirejs</groupId> 
         <artifactId>requirejs</artifactId> 
         <classifier>repackaged</classifier> 
         <type>zip</type> 
         <targetPath>lib</targetPath> 
         <includes> 
          <include>requirejs/require.js</include> 
          <include>requirejs/require/*</include> 
          <include>requirejs/build/**</include> 
         </includes> 
        </overlay> 
        <overlay> 
         <groupId>com.jqueryui</groupId> 
         <artifactId>jquery-ui</artifactId> 
         <classifier>repackaged</classifier> 
         <type>zip</type> 
         <targetPath>lib</targetPath> 
        </overlay> 
       </overlays> 
      </configuration> 
     </plugin> 

A pesar de que no necesito requirejs/build/** a terminar en la guerra, estoy incluyéndolo como parte de la superposición para obtener los scripts de compilación RequireJS descomprimidos, simplemente porque no he encontrado una mejor manera.

Luego tengo una tarea de complemento Exec que realiza la compilación. Pero tenga en cuenta que esta tarea no se ha añadido al flujo normal de trabajo de compilación: tengo que invocar manualmente con mvn exec:execdespués se realiza el embalaje GUERRA:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.1</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>exec</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <executable>lib/requirejs/build/build.bat</executable> 
       <workingDirectory>${project.build.directory}/${project.artifactId}</workingDirectory> 
       <arguments> 
        <argument>name=bootstrap</argument> 
        <argument>out=combined.js</argument> 
        <argument>baseUrl=scripts</argument> 
        <argument>optimize=closure</argument> 
        <argument>excludeShallow=plugins/manifest</argument> 
       </arguments> 
      </configuration> 
     </plugin> 

Así, algunas preguntas son:

  1. ¿Cómo puedo extraer diferentes porciones de una única dependencia comprimida para los pasos de compilación y empaquetado WAR? ¿O tengo que crear dos archivos zip, uno con el material de tiempo de ejecución y el otro para los scripts de compilación?
  2. Me gustaría disparar exec:exec idealmente durante la compilación, o si no, justo antes del embalaje de WAR. ¿Cómo puedo hacer eso?

En realidad, he intentado un montón de cosas sin éxito, así que espero no aparecer como perezosamente publicar un gran trozo de código y esperar respuestas :) Es solo que no me he arrepentido cómo funcionan los objetivos/fases de Maven, etc.

+0

¿Tal vez podría publicar el fragmento de pom relevante? – Raghuram

+0

@ Raghuram: Listo. –

Respuesta

4

se me ha ocurrido con la siguiente solución que funciona para mí:

vez de depender de la superposición de guerra para el desembalaje de los archivos RequireJS, que explícitamente descomprimir usando el plugin Dependencia:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>compile</phase> 
     <goals> 
      <goal>unpack</goal> 
     </goals> 
     <configuration> 
      <artifactItems> 
      <artifactItem> 
       <groupId>org.requirejs</groupId> 
       <artifactId>requirejs</artifactId> 
       <version>0.22.0</version> 
       <type>zip</type> 
       <classifier>repackaged</classifier> 
       <overWrite>true</overWrite> 
      </artifactItem> 
      </artifactItems> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

La fase está configurada para "compilar". Esto me permite tener todo el contenido del paquete RequireJS debajo de la carpeta "dependency", durante la compilación. Por lo tanto, la siguiente cosa que tengo es:

 <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.1</version> 
     <executions> 
      <execution> 
      <phase>compile</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       <executable> 
       ${project.build.directory}/dependency/requirejs/build/build.bat</executable> 
       <workingDirectory> 
       ${basedir}/src/main/webapp</workingDirectory> 
       <arguments> 
       <argument>name=bootstrap</argument> 
       <argument>out=scripts/compiled.js</argument> 
       <argument>baseUrl=scripts</argument> 
       <argument>optimize=closure</argument> 
       <argument> 
       excludeShallow=plugins/manifest</argument> 
       </arguments> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 

Esto desencadena la compilación RequireJS dentro de la carpeta "dependencia", sin tocar mi directorio de origen o en el directorio WAR. Luego continúo utilizando el complemento de superposición WAR para seleccionar los archivos RequireJS que desean ingresar al WAR.

actualización

Después de haber escrito esta solución, he pasado a utilizar el objetivo "java" en lugar de "ejecutivo" porque tenía problemas con el uso de archivo de comandos shell + lote de la RequireJS del compilador a través de Hudson. Básicamente ejecuto el comando final de Java (generado por los scripts) que ejecuta el compilador a través de Rhino. La solución de nodo sería ligeramente diferente. Para RequireJS 0.23.0, que es algo como esto:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.1</version> 
    <executions> 
     <execution> 
      <id>compile-js</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       <executable>java</executable> 
       <workingDirectory>${basedir}/src/main/webapp</workingDirectory> 
       <arguments> 
        <argument>-classpath</argument> 
        <!--argument>${project.build.directory}/dependency/requirejs/build/lib/rhino/js.jar${path.separator}${project.build.directory}/dependency/requirejs/build/lib/closure/compiler.jar</argument --> 
        <argument>${project.build.directory}/dependency/requirejs/build/lib/rhino/js.jar</argument> 
        <argument>org.mozilla.javascript.tools.shell.Main</argument> 
        <argument>${project.build.directory}/dependency/requirejs/bin/x.js</argument> 
        <argument>${project.build.directory}/dependency/requirejs/bin/</argument> 
        <argument>${project.build.directory}/dependency/requirejs/build/build.js</argument> 
        <argument>name=bootstrap</argument> 
        <argument>out=scripts/compiled.js</argument> 
        <argument>baseUrl=scripts</argument> 
        <argument>optimize=none</argument> 
       </arguments> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+0

Esto intenta ejecutar el nodo, por lo que aparece un mensaje de error al ejecutar el compilador. Nodo no debe ser un requisito para el compilador requirejs, ¿no? – adam

+0

@adam: Esto fue con RequireJS 0.22.0. ¿Probaste esto con 0.23.0? Los scripts de compilación son significativamente diferentes entre los dos. –

+0

Sí, estaba usando 0.23.0, que ejecuta el comando node en build.bat o cualquiera que ejecute .bat – adam

8
+0

Lo he movido a https://github.com/jakewins/brew que agrega soporte para compilar coffeescript y plantillas haml. El plugin brew tiene algunas correcciones de errores que no están disponibles en requirejs-maven. Brew todavía es inestable, pero se desarrolla activamente y se usa en producción. – jakewins

6

hay un experto Plugin dirigidos específicamente para RequireJS optimización en:

https://github.com/mcheely/requirejs-maven-plugin

Siempre se debe enviar con una versión reciente de RequireJS, y es bastante fácil anularlo al agregar una versión diferente a su proyecto y especificar su ruta en la configuración del complemento.

Descripción completa: escribí el complemento.

+0

¡Hola! Trataré de ... –

+0

Esto funciona muy bien si el proyecto es independiente, pero no parece funcionar si hacemos cosas a través de la superposición de maven-war-plugin (según la pregunta de OP), ¿o sí? –

Cuestiones relacionadas