Aplikacja internetowa Javascript i serwer Java, skompiluj wszystko w Maven lub użyj Grunt do aplikacji internetowej?

97

Tworzymy aplikację internetową z AngularJS i podoba nam się pomysł wykorzystania Bower for Dependency Management i Grunt do budowania, uruchamiania testów itp. ( Yeoman )

Serwer jest zrobiony z Javą przy użyciu Mavena, więc oczywiście chcielibyśmy, aby mvn installwszystko było proste (aplikacja internetowa + serwer)

Jakie więc podejście obrałeś i dlaczego?

1) Potraktuj je jako dwie różne aplikacje, którymi w rzeczywistości są. Zatem używanie różnych metod / narzędzi budowlanych jest dopuszczalne.

2) Zapomnij o Grunt Bower, używaj wtyczek Maven do budowania, uruchamiania testów, zarządzania zależnościami dla aplikacji internetowej. Jeśli tak, to które?

3) Użyj wtyczki Maven exec, aby wywołać Grunta w celu zbudowania front-endowej aplikacji internetowej. Postrzegam to bardziej jako hack niż rozwiązanie.

4) Inne.

Podejście łatwiejsze do integracji z Jenkins jest plusem.

Z góry dziękuję!

unieważnić
źródło
2
Po trzech latach integracja narzędzi wyraźnie się poprawiła. Wydaje się, że ta wtyczka Maven
kamera douszna

Odpowiedzi:

73

Po dłuższej pracy z każdym narzędziem do zarządzania zasobami w zestawie narzędzi Java doszedłem do kilku wniosków:

Narzędzia oparte na języku Java

Istnieje kilka narzędzi, ale najpopularniejsze to JAWR i Wro4J. Największym problemem z obydwoma jest to, że są one głównie oparte na Rhino (WRO4J ma teraz wsparcie dla węzłów), a Rhino działa wolno w porównaniu do narzędzi opartych na węzłach. Musisz również wziąć pod uwagę, że narzędzia JavaScript szybko się rozwijają, dlatego powinieneś szukać narzędzi, które mogą się szybko poruszać.

  • WRO4J - Wsparcie jest świetne, integracja Maven I Eclipse jest świetna, lista wtyczek jest obszerna, a struktura jest na tyle elastyczna, że ​​przy odrobinie smaru można napisać wtyczkę na wszystko, czego potrzebujesz. Jeśli jesteś ograniczony do potoku zasobów opartego na Javie, jest to z pewnością droga. Problem z Wro4j polega na tym, że jest powolny (nawet gdy uruchamia procesy Node) w porównaniu z narzędziami opartymi na Node.
    Aby podać rzeczywiste liczby, kompilacja i konkatenacja 25 pakietów zasobów zawierających MNIEJ, CSS CoffeeScript i JavaScript zajmuje około 35 sekund przy używaniu Rhino i ~ 15 sekund przy użyciu obsługi Wro4j's Node na iMacu 2013 z 16 GB pamięci RAM. Używanie Grunt + Node na moim słabym MacBooku Air zajmuje około 2 s.

  • JAWR - Integracje i lista funkcji są całkiem dobre, ale dokumentacja nie jest świetna, a pisanie własnych wtyczek może być trochę trudne. Kiedy pierwotnie pisałem ten post, JAWR znajdował się w środku 4-letniej przerwy, ale teraz jest ponownie aktywnie rozwijany od stycznia 2014 r. Jeśli zdecydujesz się zbadać narzędzia Java, warto to zbadać.

Narzędzia oparte na węzłach (zintegrowane z kompilacjami Ant / Maven)

  • Grunt - to proste, ma fantastyczny ekosystem wtyczek, a społeczność jest ogromna. Jeśli jest coś, co musisz zrobić, możesz się założyć, że jest do tego wtyczka - być może nawet napisana przez twórców pomruka. Główną krytyką Grunta jest to, że jest on sterowany konfiguracją, co sprawia, że ​​konfiguracja jest bardzo łatwa, ale nie jest „sposobem węzła”. Warto również wspomnieć, że zadania Grunt nie są łatwe do komponowania, więc w przypadku złożonego potoku kompilacji JavaScript Grunt może nie być idealny.

  • Gulp - Gulp to szybko rozwijająca się alternatywa dla Grunt. Domyślnie jest współbieżny i wykorzystuje strumienie, aby uniknąć tymczasowych zapisów w systemie plików, co może znacznie przyspieszyć twoją kompilację. Gulp jest bardzo idiomatyczny i kładzie nacisk na konfigurację kodu> i chociaż daje ci to dużo mocy, nie jest idealny dla zespołów, które nie mają podstawowych kompetencji w JavaScript.

Jedynym potencjalnym problemem dla narzędzi opartych na JavaScript jest to, że będziesz musiał mieć Node , npm i grunt-cli / gulp na każdej maszynie, która musi wykonać kompilację. Jeśli nie masz dostępu do swoich maszyn CI lub nie używasz wdrożeń opartych na artefaktach, może to być trudna sprzedaż.

Integracja tego z projektem Maven jest dość łatwa i masz sporo opcji. Możesz użyć wtyczki Maven ant-run , możesz uruchomić zadanie ant exec i wywołać je z Mavena lub, co najlepsze, po prostu użyć zadania maven exec .
Poniżej znajduje się kod do zintegrowania tego z cyklem życia Mavena za pomocą wtyczki exec, jeśli jest to pomocne dla kogoś.

    <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
źródło
1
Dzięki za szczegółową odpowiedź. Myślę, że wybiorę opcję narzędzi opartych na węzłach. Nowy w Grunt Podoba mi się to, co do tej pory widziałem i byłoby wspaniale, gdybym mógł mieć to, co najlepsze z dwóch światów. Nie wiedziałem o istnieniu WRO4J i JAWR. Dzięki jeszcze raz.
nieważne
wro4j integruje procesor less4j, który jest opartą na Javie implementacją less.js, której wydajność jest porównywalna z natywnym procesorem node.js.
Alex Objelean
1
Powodem, dla którego wro4j nie jest tak szybki w przypadku node.js, jest głównie to, że wymaga on operacji we / wy dysku przy każdym wykonaniu. Można to poprawić tylko wtedy, gdy procesy oparte na node.js (takie jak lessc) umożliwiałyby kompilację zasobów w pamięci.
Alex Objelean
12
Czy ten proces obsługuje niepowodzenie Mavenkompilacji, jeśli gruntkompilacja się nie powiedzie?
Snekse
6
Każde zadanie exec, które nie powraca poprawnie, powinno zakończyć się niepowodzeniem kompilacji. stackoverflow.com/questions/3480162/…
Baer
24

Dla każdego, kto wciąż szuka więcej informacji na ten temat, jeden z twórców Yeoman ma dobry artykuł (napisany kilka miesięcy po pierwszym zadaniu tego pytania), który rozszerza oryginalną odpowiedź o nieco więcej szczegółów:

Jeff Smith
źródło
Podwójne dzięki! Uważam, że ten post był niezwykle pomocny i był bardziej tym, czego szukałem,
Ryan J. McDonough
13

Jest też wtyczka frontend-maven: https://stackoverflow.com/a/19600777/320399 Pobiera dla ciebie Node i NPM (lokalnie do twojego projektu), pobiera Grunt przez ten NPM (uruchamiany przez ten węzeł), a następnie uruchamia Grunt (przez ten węzeł). Jest to samoczynne uruchamianie się i nie musisz instalować Node na komputerze, aby zbudować projekt. Tylko jedno polecenie; mvn install.

Eirik Sletteberg
źródło
13

Możesz sprawdzić http://jhipster.github.io/ : jest to generator Yeoman, który generuje aplikację, w której Maven, Grunt i Bower pracują razem.

To trochę jak twoja trzecia opcja, ale wszystko jest skonfigurowane dla ciebie, co nie jest takie łatwe. Generuje również dla Ciebie podstawowe usługi AngularJS i Java REST.

Julien Dubois
źródło
1
Za późno na rozpoczęcie projektu ze świeżo wygenerowaną aplikacją. Ale to jest świetne i bardzo pomocne, pożyczę część rozwiązań z wygenerowanej aplikacji i wykorzystam w moim projekcie. Dzięki!
Matsemann
2
Właściwie wystarczy dołączyć wtyczkę yeoman-maven-plugin, co pozwala na umieszczenie wszystkich elementów konfiguracyjnych JavaScript (bower, npm, grunt) jako rodzeństwa w pom.xml (dokładnie tam, gdzie te pliki powinny należeć do IMO), a po mvn install to zbuduje wszystko - łącznie z twoją aplikacją internetową w src / main / webapp. Przeniesienie istniejącego projektu do tej struktury zajęło mi mniej niż pół godziny. Oczywiście powinieneś rzucić
raven_arkadon
4

po kilku godzinach spędzonych nad tym problemem mogę powiedzieć tak:

maven i chrząknięcie nie grają dobrze, ale można to wymusić.

Oto opis wtyczki do uruchamiania Grunt przez kompilację Maven

mam nadzieję, że to pomoże :)

Nadav Leshem
źródło
dzięki za odpowiedź, pomaga tak, ale spróbuję zgodnie z odpowiedzią @Baer.
nieważne
9
wspomniana treść nie żyje
Peter Butkovic