Pregunta

Tengo un proyecto web que se construye con Maven y estoy tratando de averiguar la mejor manera de compilar los archivos JavaScript con el compilador RequireJS (esta pregunta podría aplicarse a cualquier compilador / Minifier también).

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

He envasados, las bibliotecas de JavaScript tercio del partido y se descargan como dependencias y luego agregó con el plugin GUERRA superposición.

Tengo una tarea plugin de ejecución que ejecuta el compilador RequireJS dentro del objetivo directorio. Yo ahora manualmente exec:exec una vez ejecutado el destino del paquete (y por lo tanto el contenido WAR se colocan en el directorio de destino).

Lo que me gustaría lugar es hacer parte de la compilación JS compilación principal (Java). El propio compilador JS (Requerir JS) se descarga como una dependencia durante la fase de superposición de guerra que ocurre después de la compilación. Por lo tanto, necesito el requieren archivos JS para ser descargado y descomprimido y necesito para ejecutar la compilación JS utilización de estos archivos, antes / durante / después de la compilación de Java.

Estoy seguro de que podría haber varias maneras de lograr esto. Estoy buscando la solución más elegante.


Actualización: fragmentos existentes POM

Tengo dependencias de JavaScript que tengo con cremallera y en 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>

Tome en cuenta que en sí RequireJS (que se requieren para la compilación del resto de bibliotecas) también se carga como una dependencia externa. Así que lo primero es que necesito esta dependencia para ser descargado y descomprimido antes de que pueda comenzar con la compilación RequireJS.

se añaden Estas dependencias a la guerra utilizando el plugin WAR Overlay:

        <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 RequireJS descomprimidos construir secuencias de comandos, simplemente porque no he encontrado una manera mejor.

A continuación, tengo una tarea plugin de ejecución 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 manualmente lo debe invocar con mvn exec:exec después el embalaje se realiza 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>

Por lo tanto, algunas preguntas son:

  1. ¿Cómo puedo extraer diferentes partes de una sola dependencia con cremallera para la compilación y WAR etapas de envasado? O tengo que crear dos archivos zip, uno con sólo las cosas en tiempo de ejecución y el otro para los scripts de compilaciones?
  2. Me gustaría exec:exec gatillo idealmente durante la compilación, o si no, sólo antes del envasado GUERRA. ¿Cómo lo hago?

De hecho, me han intentado un montón de cosas sin éxito, así que espero que no me presento como la publicación perezosamente un enorme trozo de código y esperando respuestas :) Es sólo que no lo he envuelto alrededor de mi mente cómo Maven objetivos / fases etc. trabajo todavía.

¿Fue útil?

Solución 3

Yo he llegado con la siguiente solución que funciona para mí:

En lugar de depender de la superposición de guerra para el desembalaje de los archivos RequireJS, que explícitamente desempaquetar los archivos 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 se establece en "compilación". Esto me permite tener todo el contenido del paquete RequireJS bajo la carpeta "dependencia", 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>

RequireJS Esto desencadena la compilación dentro de la carpeta "dependencia", sin que ninguna de mi directorio de origen tocar o el directorio WAR. luego continúo con el GUERRA superposición plugin para selección de la cereza los archivos RequireJS que quieren entrar en la guerra.

Actualizar

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 por lotes + cáscara de la RequireJS del compilador a través de Hudson. básicamente estoy ejecutando el mandato Java final (generada por los scripts) que se ejecutan a través del compilador Rhino. La solución 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>

Otros consejos

Hay un plugin de Maven dirigido específicamente para RequireJS optimización en:

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

Siempre debe enviar con una versión reciente de RequireJS, y es bastante fácil de reemplazar que mediante la adición de una versión diferente a su proyecto, y especificando su ruta en el plugin de configuración.

La revelación completa:. Escribí el plugin

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top