Javascript-Webanwendung und Java-Server, alles in Maven erstellen oder Grunt für die Webanwendung verwenden?

97

Wir machen eine Webanwendung mit AngularJS und wir mögen die Idee, Bower für das Abhängigkeitsmanagement und Grunt zum Erstellen, Ausführen von Tests usw. zu verwenden ( Yeoman )

Der Server wird mit Java unter Verwendung von Maven erstellt, daher möchten wir natürlich mit einem einfachen mvn installBuild alles (Webanwendung + Server)

Welchen Ansatz haben Sie gewählt und warum?

1) Behandle sie als zwei verschiedene Anwendungen, die sie tatsächlich sind. Die Verwendung unterschiedlicher Bauweisen / Werkzeuge ist daher akzeptabel.

2) Vergessen Sie Grunt Bower, verwenden Sie Maven-Plugins zum Erstellen, Ausführen von Tests und Verwalten von Abhängigkeiten für die Webanwendung. Wenn das der Fall ist, welche?

3) Verwenden Sie das Maven Exec-Plugin, um Grunt aufzurufen und die Front-End-Webanwendung zu erstellen. Ich sehe das eher als Hack als als Lösung.

4) Andere.

Ein Ansatz, der einfacher in Jenkins zu integrieren ist, ist von Vorteil.

Danke im Voraus!

Leere
quelle
2
3 Jahre später hat sich die Werkzeugintegration offensichtlich verbessert. Dieses Maven-Plugin scheint die meisten Dinge abgedeckt zu haben: github.com/eirslett/frontend-maven-plugin
earcam

Antworten:

73

Nachdem ich eine Weile mit fast jedem Asset-Pipeline-Tool im Java-Toolkit gearbeitet habe, bin ich zu einigen Schlussfolgerungen gekommen:

Java-basiertes Tooling

Es gibt eine Handvoll Tools, aber die beliebtesten sind JAWR und Wro4J. Das größte Problem bei beiden ist, dass sie hauptsächlich auf Rhino basieren (WRO4J hat jetzt einige Node-Unterstützung) und Rhino im Vergleich zu Node-basierten Tools nur langsam ist. Sie müssen auch berücksichtigen, dass das JavaScript-Tool schnell ausgereift ist, sodass Sie nach Tools suchen sollten, die sich schnell bewegen lassen.

  • WRO4J - Die Unterstützung ist großartig, die Integration von Maven UND Eclipse ist großartig. Die Liste der Plugins ist umfangreich und das Framework ist flexibel genug, dass Sie mit etwas Ellbogenfett ein Plugin für alles schreiben können, was Sie brauchen. Wenn Sie sich auf eine Java-basierte Asset-Pipeline beschränken, ist dies mit Sicherheit der richtige Weg. Das Problem mit Wro4j ist, dass es im Vergleich zu knotenbasierten Tools langsam ist (selbst wenn es Knotenprozesse startet).
    Um einige reale Zahlen zu kompilieren und zu verketten, die 25 Asset-Bundles mit WENIGER, CSS CoffeeScript und JavaScript enthalten, dauert die Verwendung von Rhino ca. 35 Sekunden und die Verwendung der Knotenunterstützung von Wro4j auf einem 2013 iMac mit 16 GB RAM ca. 15 Sekunden. Die Verwendung von Grunt + Node dauert auf meinem mickrigen MacBook Air ungefähr 2 Sekunden.

  • JAWR - Die Integrationen und die Funktionsliste sind ziemlich gut, aber die Dokumente sind nicht großartig und das Schreiben eigener Plugins kann etwas schwierig sein. Als ich diesen Beitrag ursprünglich schrieb, befand sich JAWR mitten in einer 4-jährigen Pause, befindet sich jedoch seit Januar 2014 wieder in der aktiven Entwicklung. Wenn Sie sich für die Untersuchung von Java Tools entscheiden, ist dies eine Untersuchung wert.

Knotenbasiertes Tooling (integriert in Ant / Maven Builds)

  • Grunzen - Es ist einfach, hat ein fantastisches Plugin-Ökosystem und die Community ist riesig. Wenn Sie etwas tun müssen, können Sie darauf wetten, dass es ein Plugin dafür gibt - möglicherweise sogar eines, das von den Machern von grunt geschrieben wurde. Die Hauptkritikpunkte von Grunt sind, dass es konfigurationsgesteuert ist, was eine sehr einfache Einrichtung ermöglicht, aber nicht der "Node Way" ist. Erwähnenswert ist auch, dass Grunt-Aufgaben nicht einfach zu komponieren sind, sodass Grunt für eine komplexe JavaScript-Build-Pipeline möglicherweise nicht ideal ist.

  • Gulp - Gulp ist die schnell wachsende Alternative zu Grunt. Es ist standardmäßig gleichzeitig und verwendet Streams, um temporäre Schreibvorgänge in das Dateisystem zu vermeiden, die Ihren Build erheblich beschleunigen können. Gulp ist sehr idiomatisch und konzentriert sich auf Code> Konfiguration. Dies gibt Ihnen zwar viel Leistung, ist jedoch nicht ideal für Teams, die keine Kernkompetenz in JavaScript haben.

Das einzige mögliche Problem für JavaScript-basierte Tools besteht darin, dass Sie Node , npm und grunt-cli / gulp auf jedem Computer haben müssen, der die Kompilierung durchführen muss. Wenn Sie keinen Zugriff auf Ihre CI-Maschinen haben oder keine auf Artefakten basierenden Bereitstellungen verwenden, kann dies ein schwerer Verkauf sein.

Die Integration in Ihr Maven-Projekt ist ziemlich einfach und Sie haben einige Optionen. Sie können das Maven Ant-Run-Plugin verwenden , eine Ant Exec-Task ausführen und von Maven aus aufrufen oder am besten einfach die Maven Exec-Task verwenden .
Unten finden Sie den Code, um dies mithilfe des exec-Plugins in den Maven-Lebenszyklus zu integrieren, wenn dies für jemanden hilfreich ist.

    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <executions>
        <execution>
          <phase>prepare-package</phase>
          <goals>
            <goal>exec</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <executable>grunt</executable>
      </configuration>
    </plugin>
Baer
quelle
1
Danke für die ausführliche Antwort. Ich denke, ich werde mich für die Option Node Based Tooling entscheiden. Neu bei Grunt Ich mag das, was ich bisher gesehen habe, und wäre großartig, wenn ich das Beste aus zwei Welten haben könnte. Ich wusste nichts über die Existenz von WRO4J und JAWR. Danke noch einmal.
nichtig
wro4j integriert den less4j-Prozessor, der eine Java-basierte Implementierung von less.js ist, deren Leistung mit der nativen von node.js vergleichbar ist.
Alex Objelean
1
Der Grund, warum wro4j mit node.js nicht so schnell ist, liegt hauptsächlich darin, dass für jede Ausführung Festplatten-E / A-Operationen erforderlich sind. Dies könnte nur verbessert werden, wenn auf node.js basierende Prozesse (wie lessc) die speicherinterne Kompilierung von Ressourcen ermöglichen würden.
Alex Objelean
12
Unterstützt dieser Prozess das Fehlschlagen des MavenBuilds, wenn der gruntBuild fehlschlägt?
Snekse
6
Jede Exec-Task, die nicht ordnungsgemäß zurückgegeben wird, sollte den Build fehlschlagen. stackoverflow.com/questions/3480162/…
Baer
24

Für alle, die noch nach weiteren Informationen zu diesem Thema suchen, hat einer der Schöpfer von Yeoman einen guten Artikel (der einige Monate nach der ursprünglichen Beantwortung dieser Frage geschrieben wurde), der die ursprüngliche Antwort um etwas mehr Details erweitert:

Jeff Smith
quelle
Doppelter Dank! Ich fand diesen Beitrag äußerst hilfreich und es war mehr, wonach ich suchte,
Ryan J. McDonough
13

Dann gibt es noch das Frontend-Maven-Plugin: https://stackoverflow.com/a/19600777/320399 Es lädt Node und NPM für Sie herunter (lokal für Ihr Projekt), lädt Grunt über diesen NPM herunter (wird von diesem Node ausgeführt) und dann führt Grunt aus (über diesen Knoten). Es ist ein Selbst-Bootstrapping, und Sie müssen Node nicht auf dem Computer installiert haben, um das Projekt zu erstellen. Nur ein Befehl; mvn installieren.

Eirik Sletteberg
quelle
13

Vielleicht möchten Sie http://jhipster.github.io/ auschecken : Es ist ein Yeoman-Generator, der eine Anwendung generiert, bei der Maven, Grunt und Bower zusammenarbeiten.

Es ist ein bisschen wie Ihre dritte Option, aber alles ist für Sie konfiguriert, was nicht so einfach ist. Außerdem werden die grundlegenden AngularJS- und Java-REST-Services für Sie generiert.

Julien Dubois
quelle
1
Es ist zu spät für mein Projekt, mit einer frisch generierten Anwendung zu beginnen. Aber das ist großartig und sehr hilfreich. Ich werde einige der Lösungen aus der generierten Anwendung ausleihen und in meinem Projekt verwenden. Vielen Dank!
Matsemann
2
Eigentlich müssen Sie nur das yeoman-maven-Plugin einbinden, und dies ermöglicht es Ihnen, alle JavaScript-Konfigurationsmaterialien (bower, npm, grunt) als Geschwister in die pom.xml (genau dort, wo diese Dateien IMO gehören sollten) und darüber zu legen Bei der mvn-Installation wird einfach alles erstellt - einschließlich Ihrer Webanwendung unter src / main / webapp. Ich habe weniger als eine halbe Stunde gebraucht, um ein bestehendes Projekt auf diese Struktur zu portieren. Natürlich sollten Sie sich die Beispiel-App unter github.com/jhipster/jhipster-sample-app
raven_arkadon am
4

Nach ein paar Stunden, die ich mit diesem Problem verbracht habe, kann ich Folgendes sagen:

Maven und Grunzen spielen nicht gut, aber es kann erzwungen werden.

Hier ist eine Plugin-Beschreibung zum Ausführen von Grunt über Maven Build

ich hoffe das hilft :)

Nadav Leshem
quelle
danke für die antwort, es hilft ja aber ich werde es laut @Baer antwort versuchen.
nichtig
9
verwiesener Kern ist tot
Peter