App Web Javascript e server Java, costruisci tutto in Maven o usi Grunt per l'app web?


97

Stiamo realizzando un'applicazione web con AngularJS e ci piace l'idea di utilizzare Bower per la gestione delle dipendenze e Grunt per la creazione, l'esecuzione di test ecc. ( Yeoman )

Il server è fatto con Java usando Maven, quindi ovviamente vorremmo con una semplice mvn installbuild tutto (applicazione web + server)

Allora quale approccio hai adottato e perché?

1) Trattali come due applicazioni diverse, che in effetti sono. Quindi l'utilizzo di metodi / strumenti di costruzione diversi è accettabile.

2) Dimentica Grunt Bower, usa i plugin Maven per creare, eseguire test, gestire le dipendenze per l'applicazione web. Se è così, quali?

3) Utilizzare il plug-in exec Maven per chiamare Grunt e creare la webapp front-end. Lo vedo più come un trucco che come una soluzione.

4) Altro.

Un approccio più facile da integrare con Jenkins è un vantaggio.

Grazie in anticipo!


2
Dopo 3 anni l'integrazione degli strumenti è ovviamente migliorata. Questo plugin esperto sembra avere la maggior parte delle cose coperte: github.com/eirslett/frontend-maven-plugin
earcam

Risposte:


73

Dopo aver lavorato per un po 'con quasi tutti gli strumenti di pipeline di risorse nel toolkit Java, sono giunto ad alcune conclusioni:

Strumenti basati su Java

Ci sono una manciata di strumenti là fuori, ma i più popolari sono JAWR e Wro4J. Il problema più grande con entrambi è che sono per lo più basati su Rhino (WRO4J ora ha un supporto per i nodi) e Rhino è lento rispetto agli strumenti basati sui nodi. Devi anche considerare che gli strumenti JavaScript stanno maturando rapidamente, quindi dovresti cercare strumenti che possano muoversi rapidamente.

  • WRO4J - Il supporto è ottimo, l'integrazione di Maven ED Eclipse è ottima, l'elenco dei plugin è ampio e il framework è abbastanza flessibile che con un po 'di olio di gomito puoi scrivere un plugin per qualsiasi cosa tu abbia bisogno. Se sei limitato a una pipeline di risorse basata su Java, questa è sicuramente la strada da percorrere. Il problema con Wro4j è che è lento (anche quando avvia i processi Node) rispetto agli strumenti basati su Node.
    Per fornire alcuni numeri del mondo reale compilando e concatenando 25 pacchetti di risorse contenenti MENO, CSS CoffeeScript e JavaScript impiegano circa 35 secondi quando si utilizza Rhino e circa 15 secondi utilizzando il supporto Node di Wro4j su un iMac 2013 con 16 GB di RAM. L'utilizzo di Grunt + Node richiede circa 2 secondi sul mio gracile MacBook Air.

  • JAWR - Le integrazioni e l'elenco delle funzionalità sono piuttosto buone, ma i documenti non sono eccezionali e scrivere i propri plugin può essere un po 'complicato. Quando ho scritto originariamente questo post, JAWR era nel mezzo di una pausa di 4 anni, ma ora è di nuovo in fase di sviluppo attivo a partire da gennaio 2014. Se scegli di indagare su Java Tools, vale la pena indagare.

Strumenti basati sui nodi (integrati con Ant / Maven Builds)

  • Grunt - È facile, ha un fantastico ecosistema di plugin e la community è enorme. Se c'è qualcosa che devi fare, puoi scommettere che c'è un plugin per questo, forse anche uno scritto dai creatori di grunt. Le principali critiche a Grunt sono che è basato sulla configurazione, il che rende molto semplice l'installazione, ma non è il "Node Way". Vale anche la pena ricordare che le attività di Grunt non sono facilmente componibili, quindi per una pipeline di build JavaScript complessa Grunt potrebbe non essere l'ideale.

  • Gulp - Gulp è l'alternativa in rapida crescita a Grunt. È simultaneo per impostazione predefinita e utilizza i flussi per evitare scritture temporanee sul file system che possono velocizzare notevolmente la creazione. Gulp è molto idiomatico e pone l'accento sulla configurazione del codice e sebbene questo ti dia molta potenza, non è l'ideale per i team che non hanno una competenza di base in JavaScript.

L'unico potenziale blocco per gli strumenti basati su JavaScript è che dovrai avere Node , npm e grunt-cli / gulp su qualsiasi macchina che deve eseguire la compilazione. Se non hai accesso alle tue macchine CI o non utilizzi distribuzioni basate su artefatti, potrebbe essere difficile vendere.

Integrarlo nel tuo progetto Maven è piuttosto semplice e hai diverse opzioni. Puoi utilizzare il plug-in Maven ant-run , puoi eseguire un'attività di esecuzione di ant e chiamarla da Maven o, soprattutto, puoi semplicemente usare l' attività di esecuzione di Maven .
Di seguito è riportato il codice per integrarlo nel ciclo di vita di Maven utilizzando il plug-in exec se questo è utile a chiunque.

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

1
Grazie per la risposta dettagliata. Penso che sceglierò l'opzione Node Based Tooling. Nuovo a Grunt Mi piace quello che ho visto finora, e sarebbe fantastico se potessi avere il meglio di due mondi. Non sapevo dell'esistenza di WRO4J e JAWR. Grazie ancora.
void

wro4j integra il processore less4j che è un'implementazione basata su java di less.js le cui prestazioni sono paragonabili a quelle native di node.js.
Alex Objelean

1
Il motivo per cui wro4j non è così veloce con node.js, è principalmente perché richiede operazioni di I / O del disco per ogni esecuzione. Ciò potrebbe essere migliorato solo se i processi basati su node.js (come lessc) consentissero la compilazione in memoria delle risorse.
Alex Objelean

12
Questo processo supporta il fallimento della Mavenbuild se la gruntbuild fallisce?
Snekse

6
Qualsiasi attività di esecuzione che non viene restituita correttamente dovrebbe fallire la compilazione. stackoverflow.com/questions/3480162/…
Baer

24

Per chiunque sia ancora alla ricerca di ulteriori informazioni su questo argomento, uno dei creatori di Yeoman ha un buon articolo (scritto pochi mesi dopo che questa domanda è stata inizialmente posta) che espande la risposta originale con un po 'più di dettaglio:


Doppio grazie! Ho trovato questo post estremamente utile ed era più quello che stavo cercando,
Ryan J. McDonough

13

Poi c'è anche il plug-in frontend-maven: https://stackoverflow.com/a/19600777/320399 Scarica Node e NPM per te (localmente nel tuo progetto), scarica Grunt tramite quell'NPM (gestito da quel Nodo) e poi esegue Grunt (tramite quel nodo). È autoavvio e non è necessario che Node sia installato sulla macchina per creare il progetto. Un solo comando; mvn install.


13

Potresti voler controllare http://jhipster.github.io/ : è un generatore di Yeoman, che genera un'applicazione in cui Maven, Grunt e Bower lavorano tutti insieme.

È un po 'come la tua terza opzione, ma tutto è configurato per te, il che non è così facile. Sta anche generando i servizi AngularJS e Java REST di base per te.


1
È troppo tardi perché il mio progetto inizi con un'applicazione appena generata. Ma questo è fantastico e molto utile, prenderò in prestito alcune delle soluzioni dall'applicazione generata e le userò nel mio progetto. Grazie!
Matsemann

2
In realtà, devi solo includere il plugin yeoman-maven e questo ti permette di mettere tutte le cose di configurazione JavaScript (bower, npm, grunt) come fratelli nel pom.xml (esattamente dove questi file dovrebbero appartenere IMO), e su mvn install creerà tutto, inclusa la tua webapp sotto src / main / webapp. Mi ci è voluta meno di mezz'ora per portare un progetto esistente in quella struttura. Ovviamente dovresti dare un'occhiata all'app di esempio su github.com/jhipster/jhipster-sample-app
raven_arkadon

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.