Javascript веб-приложение и Java-сервер, построить все в Maven или использовать Grunt для веб-приложения?

Мы делаем веб-приложение с AngularJS, и нам нравится идея использования Bower for Dependency Management и Grunt для создания, запуска тестов и т.д. (Yeoman)

Сервер выполняется с помощью Java с использованием Maven, поэтому, конечно, мы бы хотели с простым mvn install построить все (веб-приложение + сервер)

Какой подход вы взяли и почему?

1) Рассматривайте их как два разных приложения, которые на самом деле они есть. Таким образом, использование различных методов/инструментов здания приемлемо.

2) Забудьте о Grunt Bower, используйте плагины Maven для создания, запуска тестов, управления зависимостями для веб-приложения. Если это так, то какие?

3) Используйте плагин Maven exec, чтобы вызвать Grunt для создания front-end webapp. Я вижу это скорее как взломать, чем решение.

4) Другое.

Более простой подход к интеграции с Дженкинсом - плюс.

Спасибо заранее!

Ответ 1

После работы с каждым инструментом конвейера ресурсов в наборе инструментов Java некоторое время я пришел к нескольким выводам:

Инструмент на основе Java

Есть несколько инструментов, но самыми популярными являются JAWR и Wro4J. Самая большая проблема с обоими из них в том, что они в основном Rhino (у WRO4J теперь есть поддержка Node), а Rhino - собака медленный по сравнению с инструментами на основе Node. Вы также должны учитывать, что инструмент JavaScript быстро созревает, поэтому вы должны искать инструменты, которые могут быстро перемещаться.

  • WRO4J - Поддержка велика, интеграция Maven и Eclipse велика, список плагинов обширен, а структура - достаточно гибкой, чтобы с некоторой консистентной смазкой вы могли написать плагин для всех, что вам нужно. Если вы ограничены конвейером на основе Java, это, безусловно, путь. Проблема с Wro4j в том, что она медленная (даже когда она запускает процессы Node) по сравнению с инструментами на основе Node.
    Чтобы дать некоторые числа в реальном мире, компилируя и объединяя 25 пакетов ресурсов, содержащих LESS, CSS CoffeeScript и JavaScript занимает около ~ 35 с при использовании Rhino и ~ 15 с использованием поддержки Wro4j Node на iMac 2013 года с 16 ГБ ОЗУ. Использование Grunt + Node занимает около 2 секунд на моем маленьком MacBook Air.

  • JAWR - Интеграция и список функций довольно хороши, но документы не велики и создают собственные плагины может быть немного сложнее. Когда я изначально написал этот пост, JAWR находился в середине 4-летнего перерыва, но теперь находится в активном развитии по состоянию на январь 2014 года. Если вы решите изучить Java Tools, это стоит изучить.

Node Основанный инструмент (интегрированный с Ant/Maven Builds)

  • Grunt - Это просто, имеет фантастическую экосистему плагина, и сообщество массово. Если вам нужно что-то сделать, вы можете поспорить, что для него есть плагин - возможно, даже один, написанный создателями ворчания. Основная критика Grunt заключается в том, что она управляется конфигурацией, что упрощает настройку, но не является "способом Node". Также стоит упомянуть, что задачи Grunt нелегко скомпонованы, поэтому для сложного конструирования JavaScript-конвейера Grunt может быть не идеальным.

  • Gulp - Gulp - это быстрорастущая альтернатива Grunt. Его одновременный по умолчанию и использует потоки, чтобы избежать временной записи в файловую систему, что может значительно ускорить вашу сборку. Gulp очень идиоматичен и имеет особый упор на настройке кодa > и, хотя это дает вам много энергии, он не идеален для команд, которые не имеют основной компетенции в JavaScript.

Единственный потенциал, зависящий от инструментария на основе JavaScript, заключается в том, что вам нужно будет Node, npm и grunt-cli/gulp на любой машине, которая должна выполнить компиляцию. Если у вас нет доступа к вашим машинам CI или вы не используете развертывания на основе артефакта, это может быть трудно продать.

Интеграция этого в ваш проект Maven довольно проста, и у вас есть довольно много вариантов. Вы можете использовать Maven ant -run plugin, вы можете запустить ant выполнить задачу и вызвать его из Maven или лучше всего вы можете просто использовать maven exec task.
Ниже приведен код для интеграции этого в жизненный цикл Maven с помощью плагина exec, если это полезно для всех.

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

Ответ 2

Для тех, кто все еще ищет дополнительную информацию по этой теме, у одного из создателей Yeoman есть хорошая статья (написанная через несколько месяцев после того, как этот вопрос изначально был задан), которая немного расширилась в исходном ответе:

Ответ 3

Тогда есть также frontend-maven-plugin: fooobar.com/questions/59290/... Он загружает Node и NPM для вас (локально для вашего проекта), загружает Grunt через этот NPM (выполняется этим Node), а затем запускает Grunt (через это Node). Он самонастраивается, и вам не нужно Node, установленное на машине для создания проекта. Только одна команда; mvn install.

Ответ 4

Возможно, вы захотите проверить http://jhipster.github.io/: это генератор Yeoman, который генерирует приложение, в котором Maven, Grunt и Bower работают вместе.

Это немного похоже на ваш третий вариант, но все настроено для вас, что не так просто. Он также генерирует базовые услуги AngularJS и Java REST для вас.