Frage

Ich habe ein Web-Projekt, das mit Maven gebaut ist und ich versuche, herauszufinden, den besten Weg, um die JavaScript-Dateien mit dem RequireJS Compiler zu kompilieren (diese Frage zu jedem Compiler gelten könnte / minifier als auch).

Ich habe ein Setup, das funktioniert, aber es verbessert werden muss:

Ich habe die 3rd-Party-JavaScript-Bibliotheken verpackt und sie werden als Abhängigkeiten heruntergeladen und dann mit dem IST Overlay-Plugin hinzugefügt.

Ich habe eine Aufgabe Exec-Plugin, das den RequireJS Compiler läuft innerhalb des Ziels Verzeichnis. Ich derzeit exec:exec nach den Paketzielläufen manuell ausführen (und damit der Krieg Inhalte werden im Zielverzeichnis abgelegt).

Was würde Ich mag stattdessen zu JS Kompilierung Teil des Haupt (Java) Compilation zu machen. Der JS-Compiler selbst (Erfordern JS) wird als eine Abhängigkeit in der WAR-Overlay Phase heruntergeladen, die nach der Kompilierung geschieht. Also, ich brauche das Erfordern JS-Dateien heruntergeladen und entpackt werden und ich brauche die JS Kompilation Verwendung dieser Dateien ausführen, vor / während / nach dem Java-Kompilierung.

Ich bin sicher, könnte es mehr Möglichkeiten, dies zu erreichen. Ich bin für die eleganteste Lösung.


Update: Bestehende POM Schnipsel

Ich habe JavaScript Abhängigkeiten, die ich habe mit Reißverschluss und zu unserem Repository-Manager:

    <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>

Beachten Sie, dass RequireJS selbst (die für die Erstellung der übrigen Bibliotheken erforderlich ist) auch als externe Abhängigkeit geladen wird. Das erste, was ist, ich brauche diese Abhängigkeit heruntergeladen und entpackt werden, bevor ich mit RequireJS Kompilierung beginnen kann.

Diese Abhängigkeiten werden an der IST hinzugefügt, um die WAR-Overlay-Plugin:

        <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>

Auch wenn ich requirejs/build/** nicht brauche in dem Krieg zu beenden, ich bin auch als Teil des Overlays der entpackten RequireJS Build-Skripte zu bekommen, nur weil ich nicht herausgefunden habe einen besseren Weg.

Dann habe ich eine Plugin Exec Aufgabe, führt die Kompilierung. Aber beachten Sie, dass diese Aufgabe nicht dem normalen Kompilation Arbeitsablauf hinzugefügt: Ich muss manuell rufen Sie es mit mvn exec:exec nach die WAR-Verpackung erfolgt:

        <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>

Also, einige Fragen sind:

  1. Wie kann ich extrahieren verschiedene Teile einer einzigen ZIP-Abhängigkeit für die Erstellung und WAR Verpackungsschritte? Oder muss ich auf zwei Zip-Dateien erstellen, eine nur mit dem Laufzeit-Sachen und die andere für Compilations Skripte?
  2. mag ich Trigger exec:exec wie im Idealfall während der Kompilierung, oder wenn nicht, kurz vor der WAR Verpackung. Wie kann ich das tun?

Ich habe versucht, tatsächlich ein Bündel aus Stoffe ohne Erfolg, so dass ich hoffe ich erscheinen nicht als faul einen großen Teil des Codes veröffentlichen und wartet auf Antworten :) Es ist nur so, dass ich nicht ganz schlang meine Gedanken um, wie Maven Ziele / Phasen usw. Arbeit noch.

War es hilfreich?

Lösung 3

Ich habe kommen mit der folgenden Lösung, die funktioniert für mich:

Statt in Abhängigkeit von dem WAR-Overlay für das Auspacken der RequireJS Dateien, ich sie explizit entpacken Sie das Dependency Plugin:

  <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>

Die Phase wird auf "Compile" gesetzt. Dies ermöglicht es mir, den gesamten Inhalt des RequireJS Pakets unter dem „Abhängigkeit“ -Ordner zu haben, während der Kompilierung. Also, das nächste, was ich habe, ist:

      <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>

Dies löst RequireJS Kompilation in dem „Abhängigkeit“ -Ordner, ohne sie zu berühren entweder meines Quellverzeichnis oder das WAR-Verzeichnis. Ich dann weiter mit der WAR-Overlay Plugin Kirsche die RequireJS Dateien auswählen, die in den Krieg gehen.

Aktualisieren

Da diese Lösung zu schreiben, habe ich mit dem „java“ Ziel statt „exec“ geschaltet, weil ich Probleme hatte, mit der Verwendung der Shell RequireJS Compiler Skript + Batch-Datei durch Hudson. Ich bin mit im Grunde den letzten Java-Befehl (erzeugt durch die Skripte), die die Compiler durch Rhino laufen. Die Node-Lösung wäre etwas anders. Für RequireJS 0.23.0, es geht ungefähr so:

<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>

Andere Tipps

Es gibt ein Maven Plugin gezielt für RequireJS Optimierung an:

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

Es sollte immer mit einer aktuellen Version von RequireJS gesendet und es ist ziemlich einfach, dass außer Kraft zu setzen, indem Sie eine andere Version zu einem Projekt hinzufügen, und es des Weges in der Plugin-Konfig.

Angabe

Vollständige Offenlegung:. Ich schrieb das Plugin

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top