Application Web Javascript et serveur Java, tout construire dans Maven ou utiliser Grunt pour l'application Web?

97

Nous faisons une application Web avec AngularJS et nous aimons l'idée d'utiliser Bower pour la gestion des dépendances et Grunt pour la construction, l'exécution de tests, etc. ( Yeoman )

Le serveur est fait avec Java en utilisant Maven, donc bien sûr nous aimerions avec un tout simple mvn installbuild (application web + serveur)

Alors, quelle approche avez-vous adoptée et pourquoi?

1) Traitez-les comme deux applications différentes, ce qu'elles sont en fait. Il est donc acceptable d'utiliser différentes méthodes / outils de construction.

2) Oubliez Grunt Bower, utilisez les plugins Maven pour créer, exécuter des tests, gérer les dépendances pour l'application Web. Si tel est le cas, lesquels?

3) Utilisez le plugin exécutable Maven pour appeler Grunt afin de créer l'application web frontale. Je vois cela plus comme un hack qu'une solution.

4) Autre.

Une approche plus facile à intégrer avec Jenkins est un plus.

Merci d'avance!

néant
la source
2
3 ans plus tard, l'intégration des outils s'est évidemment améliorée. Ce plugin maven semble avoir couvert la plupart des choses: github.com/eirslett/frontend-maven-plugin
earcam

Réponses:

73

Après avoir travaillé avec tous les outils de pipeline d'actifs dans la boîte à outils Java pendant un certain temps, je suis arrivé à quelques conclusions:

Outillage basé sur Java

Il existe une poignée d'outils, mais les plus populaires sont JAWR et Wro4J. Le plus gros problème avec ces deux éléments est qu'ils sont principalement basés sur Rhino (WRO4J a maintenant un support Node) et Rhino est lent par rapport aux outils basés sur Node. Vous devez également tenir compte du fait que les outils JavaScript mûrissent rapidement, vous devez donc rechercher des outils capables d'évoluer rapidement.

  • WRO4J - Le support est excellent, l'intégration Maven AND Eclipse est excellente, la liste des plugins est longue et le cadre est suffisamment flexible pour qu'avec un peu d'huile de coude, vous puissiez écrire un plugin pour tout ce dont vous avez besoin. Si vous êtes confiné à un pipeline d'actifs basé sur Java, c'est à coup sûr la voie à suivre. Le problème avec Wro4j est qu'il est lent (même lorsqu'il lance les processus Node) par rapport aux outils basés sur Node.
    Pour donner des chiffres réels, la compilation et la concaténation de 25 bundles d'actifs contenant LESS, CSS CoffeeScript et JavaScript prend environ 35 s lors de l'utilisation de Rhino et environ 15 s avec le support Node de Wro4j sur un iMac 2013 avec 16 Go de RAM. Utiliser Grunt + Node prend environ 2 secondes sur mon petit MacBook Air.

  • JAWR - Les intégrations et la liste des fonctionnalités sont plutôt bonnes, mais les documents ne sont pas excellents et l'écriture de vos propres plugins peut être un peu délicate. Quand j'ai écrit cet article, JAWR était au milieu d'une interruption de 4 ans, mais est maintenant de nouveau en développement actif à partir de janvier 2014. Si vous choisissez d'étudier les outils Java, cela vaut la peine d'être étudié.

Outillage basé sur les nœuds (intégré à Ant / Maven Builds)

  • Grunt - C'est facile, a un fantastique écosystème de plugins et la communauté est massive. S'il y a quelque chose que vous devez faire, vous pouvez parier qu'il existe un plugin pour cela - peut-être même un écrit par les créateurs de grunt. Les principales critiques de Grunt sont qu'il est basé sur la configuration, ce qui facilite grandement la configuration, mais ce n'est pas le "Node Way". Il convient également de mentionner que les tâches Grunt ne sont pas facilement composables, donc pour un pipeline de construction JavaScript complexe, Grunt peut ne pas être idéal.

  • Gulp - Gulp est l'alternative à croissance rapide à Grunt. Il est simultané par défaut et utilise des flux pour éviter les écritures temporaires dans le système de fichiers, ce qui peut considérablement accélérer votre construction. Gulp est très idiomatique et met l'accent sur le code> la configuration et bien que cela vous donne beaucoup de puissance, ce n'est pas idéal pour les équipes qui n'ont pas une compétence de base en JavaScript.

Le seul problème potentiel pour les outils basés sur JavaScript est que vous devrez avoir Node , npm et grunt-cli / gulp sur toute machine qui a besoin de faire la compilation. Si vous n'avez pas accès à vos machines CI ou n'utilisez pas de déploiements basés sur des artefacts, cela peut être une vente difficile.

L'intégration de cela dans votre projet Maven est assez simple et vous avez de nombreuses options. Vous pouvez utiliser le plugin ant-run Maven , vous pouvez exécuter une tâche exécutable ant et l'appeler depuis Maven ou mieux encore vous pouvez simplement utiliser la tâche exécutable maven .
Vous trouverez ci-dessous le code pour intégrer cela dans le cycle de vie de Maven à l'aide du plugin exec si cela est utile à quiconque.

    <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
la source
1
Merci pour la réponse détaillée. Je pense que je vais opter pour l'option Outillage basé sur les nœuds. Nouveau sur Grunt, j'aime ce que j'ai vu jusqu'à présent, et ce serait formidable si je pouvais avoir le meilleur des deux mondes. Je ne connaissais pas l'existence de WRO4J et de JAWR. Merci encore.
annulé le
wro4j intègre le processeur less4j qui est une implémentation Java de less.js dont les performances sont comparables à celles du processeur natif de node.js.
Alex Objelean
1
La raison pour laquelle wro4j n'est pas aussi rapide avec node.js, c'est principalement parce qu'il nécessite des opérations d'E / S de disque pour chaque exécution. Cela pourrait être amélioré uniquement si les processus basés sur node.js (comme lessc) permettaient la compilation en mémoire des ressources.
Alex Objelean
12
Ce processus prend-il en charge l'échec de la Mavengénération si la gruntgénération échoue?
Snekse
6
Toute tâche d'exécution qui ne retourne pas correctement devrait échouer la construction. stackoverflow.com/questions/3480162/…
Baer
24

Pour tous ceux qui recherchent encore plus d'informations sur ce sujet, l'un des créateurs de Yeoman a un bon article (écrit quelques mois après que cette question ait été initialement posée) qui développe la réponse originale avec un peu plus de détails:

Jeff Smith
la source
Double merci! J'ai trouvé ce post extrêmement utile et c'était plus ce que je cherchais,
Ryan J. McDonough
13

Ensuite, il y a aussi le frontend-maven-plugin: https://stackoverflow.com/a/19600777/320399 Il télécharge Node et NPM pour vous (localement dans votre projet), télécharge Grunt via ce NPM (exécuté par ce Node), puis lance Grunt (via ce nœud). C'est auto-bootstrap et vous n'avez pas besoin de Node installé sur la machine pour construire le projet. Juste une commande; mvn installer.

Eirik Sletteberg
la source
13

Vous voudrez peut-être vérifier http://jhipster.github.io/ : c'est un générateur Yeoman, qui génère une application dans laquelle Maven, Grunt et Bower fonctionnent tous ensemble.

C'est un peu comme votre troisième option, mais tout est configuré pour vous, ce qui n'est pas si simple. Il génère également les services de base AngularJS et Java REST pour vous.

Julien Dubois
la source
1
Il est trop tard pour que mon projet démarre avec une application fraîchement générée. Mais c'est génial et très utile, je vais prêter certaines des solutions de l'application générée et les utiliser dans mon projet. Merci!
Matsemann
2
En fait, il vous suffit d'inclure le plugin yeoman-maven-plugin et cela vous permet de mettre tous les éléments de configuration JavaScript (bower, npm, grunt) en tant que frères et sœurs du pom.xml (exactement où ces fichiers devraient appartenir à l'OMI), et sur mvn install, il construira juste tout - y compris votre webapp sous src / main / webapp. Il m'a fallu moins d'une demi-heure pour porter un projet existant vers cette structure. Bien sûr, vous devriez jeter un œil à l'exemple d'application sur github.com/jhipster/jhipster-sample-app
raven_arkadon
4

après quelques heures passées sur ce problème, je peux dire ceci:

maven et grunt ne jouent pas bien, mais cela peut être appliqué.

Voici une description du plugin pour exécuter Grunt via la version Maven

J'espère que ça aide :)

Nadav Leshem
la source
merci pour la réponse, cela aide oui mais je vais essayer selon la réponse @Baer.
annulé le
9
référé gist est mort
Peter Butkovic