2011-01-11 5 views
19

Ich habe ein Webprojekt, das mit Maven erstellt wurde, und ich versuche herauszufinden, die beste Möglichkeit zum kompilieren der JavaScript-Dateien mit dem RequireJS Compiler (diese Frage könnte für jeden Compiler gelten/Minifier).RequireJS Kompilierung in Maven-Projekt mit externen JS-Abhängigkeiten

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

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 Exec-Plugin-Aufgabe, die den RequireJS-Compiler im Zielverzeichnis ausführt. Ich führe derzeit exec:exec manuell aus, nachdem das Paketziel ausgeführt wurde (und daher der WAR-Inhalt im Zielverzeichnis abgelegt wird).

Was ich stattdessen möchte, ist JS-Kompilierung Teil von Main (Java) Compilation machen. Der JS-Compiler selbst (Require JS) wird während der WAR-Overlay-Phase, die nach der Kompilierung erfolgt, als Abhängigkeit heruntergeladen. Also muss ich die Require JS Dateien herunterladen und entpacken und ich muss die JS Kompilierung mit diesen Dateien ausführen, vor/während/nach der Java Kompilierung.

Ich bin mir sicher, dass es mehrere Möglichkeiten geben könnte, dies zu erreichen. Ich suche die eleganteste Lösung.


Update: Bestehende POM Schnipsel

Ich habe JavaScript Abhängigkeiten, die ich gezippt haben 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 sich RequireJS (die erforderlich ist, die Kompilierung der restlichen Bibliotheken) wird ebenfalls als externe Abhängigkeit geladen. Die erste Sache ist, dass ich diese Abhängigkeit herunterladen und entpacken muss, bevor ich mit der Erstellung von RequireJS 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 im Krieg am Ende nicht requirejs/build/** müssen, ich bin auch als Teil des Overlays um die entpackten RequireJS-Build-Skripte zu bekommen, einfach weil ich keinen besseren Weg gefunden habe.

Dann habe ich eine Exec-Plugin-Aufgabe, die die Kompilierung durchführt. Aber beachten Sie, dass diese Aufgabe wurde dem normalen Kompilation Arbeitsablauf hinzugefügt: Ich muss es manuell aufrufen, mit mvn exec:execnach 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 verschiedene Teile einer einzelnen Zip-Abhängigkeit für die Kompilierungs- und WAR-Verpackungsschritte extrahieren? Oder muss ich zwei Zip-Dateien erstellen, eine mit nur der Laufzeit und die andere für Compilations-Skripte?
  2. Ich möchte exec:exec ideal während der Kompilierung auslösen, oder wenn nicht, kurz vor WAR-Verpackung. Wie mache ich das?

Ich habe versucht, tatsächlich ein paar Sachen ohne Erfolg ab, so dass ich hoffe, dass ich nicht so faul erscheinen einen großen Teil des Codes veröffentlichen und für Antworten warten :) Es ist nur so, dass ich nicht ganz meinen Kopf gewickelt um wie Maven Ziele/Phasen usw. noch funktionieren.

+0

Vielleicht könnten Sie das relevante Pom-Snippet posten? – Raghuram

+0

@ Raghuram: Fertig. –

Antwort

4

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

Statt auf der WAR-Overlay für das Auspacken der RequireJS Dateien abhängig, ich entpacken Sie sie explizit die Abhängigkeit 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 ist auf "Kompilieren" eingestellt. Dadurch kann ich den gesamten Inhalt des RequireJS-Pakets während des Kompilierens im Ordner "dependency" speichern. 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 entweder mein Quellverzeichnis oder das WAR-Verzeichnis zu berühren. Ich benutze dann das WAR-Overlay-Plugin weiter, um die RequireJS-Dateien auszuwählen, die in den WAR gehen sollen.

aktualisiert

Da diese Lösung zu schreiben, hat mich auf mit dem „java“ geschaltet Ziel statt „exec“, weil ich mit der Verwendung des RequireJS Compiler Shell-Skript + Batch-Datei durch Hudson Probleme hatte. Ich führe grundsätzlich den letzten Java-Befehl (generiert von den Skripten) aus, der den Compiler über Rhino ausführt. 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> 
+0

Dies versucht, Knoten zu laufen, so bekomme ich eine Fehlermeldung beim Ausführen des Compilers. Knoten sollte keine Voraussetzung für Requirejs Compiler sein, nein? – adam

+0

@adam: Dies war mit RequireJS 0.22.0. Hast du das mit 0.23.0 probiert? Die Build-Skripts unterscheiden sich erheblich zwischen den beiden. –

+0

Ja, ich habe 0.23.0 benutzt, was den Node-Befehl in build.bat oder was auch immer .bat ausgeführt wird. – adam

8
+0

Ich habe dies in https://github.com/jakewins/brew verschoben, das Unterstützung für die Kompilierung von coffeescript und haml Vorlagen. Das brew Plugin hat einige Bugfixes, die in requirejs-maven nicht verfügbar sind. Brauen ist immer noch instabil, wird aber aktiv entwickelt und in der Produktion verwendet. – jakewins

6

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

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

Es sollte immer mit einem Schiff aktuelle Version von RequireJS, und es ist ziemlich einfach, dies zu überschreiben, indem Sie Ihrem Projekt eine andere Version hinzufügen und dessen Pfad in der Plugin-Konfiguration angeben.

Volle Offenbarung: Ich schrieb das Plugin.

+0

Hey! Ich werde versuchen, dass ... –

+0

Das funktioniert gut, wenn das Projekt eigenständig ist, aber es scheint nicht zu funktionieren, wenn wir Dinge per Maven-War-Plugin-Overlay ziehen (pro OP Frage) - oder? –