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: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:
- 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?
- 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.
Vielleicht könnten Sie das relevante Pom-Snippet posten? – Raghuram
@ Raghuram: Fertig. –