Aplicativo da web Javascript e servidor Java, construir tudo em Maven ou usar Grunt para aplicativo da web?

97

Estamos fazendo um aplicativo da web com AngularJS e gostamos da ideia de usar o Bower para gerenciamento de dependências e o Grunt para construir, executar testes etc. ( Yeoman )

O servidor é feito com Java usando Maven, então é claro que gostaríamos de mvn installconstruir tudo de forma simples (aplicação web + servidor)

Então, qual abordagem você adotou e por quê?

1) Trate-os como duas aplicações diferentes, que de fato são. Portanto, o uso de diferentes métodos / ferramentas de construção é aceitável.

2) Esqueça o Grunt Bower, use os plug-ins Maven para construir, executar testes e gerenciar dependências para o aplicativo da web. Se for esse o caso, quais?

3) Use o plugin Maven exec para chamar Grunt para construir o front-end webapp. Eu vejo isso mais como um hack do que uma solução.

4) Outro.

A abordagem mais fácil de integrar com o Jenkins é uma vantagem.

Desde já, obrigado!

vazio
fonte
2
3 anos depois, a integração da ferramenta obviamente melhorou. Este plug-in maven parece ter a maioria das coisas cobertas: github.com/eirslett/frontend-maven-plugin
earcam

Respostas:

73

Depois de trabalhar com cada ferramenta de pipeline de ativos no kit de ferramentas Java por um tempo, cheguei a algumas conclusões:

Ferramentas baseadas em Java

Existem várias ferramentas, mas as mais populares são JAWR e Wro4J. O maior problema com ambos é que eles são principalmente baseados em Rhino (WRO4J agora tem algum suporte para Node) e Rhino é lento em comparação com ferramentas baseadas em Node. Você também deve considerar que as ferramentas JavaScript estão amadurecendo rapidamente, portanto, você deve procurar ferramentas que podem ser movidas rapidamente.

  • WRO4J - O suporte é ótimo, a integração do Maven E do Eclipse é ótima, a lista de plug-ins é extensa e o framework é flexível o suficiente para que com um pouco de esforço você possa escrever um plug-in para o que precisar. Se você está confinado a um pipeline de ativos baseado em Java, este é o caminho a seguir. O problema com o Wro4j é que ele é lento (mesmo quando inicia os processos do Node) em relação às ferramentas baseadas no Node.
    Para dar alguns números do mundo real, compilando e concatenando 25 pacotes de recursos contendo LESS, CSS CoffeeScript e JavaScript leva cerca de 35s ao usar Rhino e ~ 15s ao usar o suporte de Node do Wro4j em um iMac 2013 com 16G de RAM. Usar o Grunt + Node leva cerca de 2s no meu MacBook Air insignificante.

  • JAWR - As integrações e a lista de recursos são muito boas, mas os documentos não são bons e escrever seus próprios plug-ins pode ser um pouco complicado. Quando escrevi este post originalmente, o JAWR estava no meio de um hiato de 4 anos, mas agora está de volta ao desenvolvimento ativo em janeiro de 2014. Se você decidir investigar as ferramentas Java, vale a pena investigar.

Ferramentas Baseadas em Nó (integrado com Ant / Maven Builds)

  • Grunt - é fácil, tem um ecossistema de plugins fantástico e a comunidade é enorme. Se há algo que você precisa fazer, pode apostar que há um plugin para isso - possivelmente até mesmo um escrito pelos criadores do grunt. As principais críticas do Grunt são que ele é orientado por configuração, o que torna a configuração muito fácil, mas não é o "jeito do nó". Também vale a pena mencionar que as tarefas do Grunt não são facilmente combináveis, portanto, para um pipeline de construção de JavaScript complexo, o Grunt pode não ser ideal.

  • Gulp - Gulp é a alternativa de rápido crescimento ao Grunt. É simultâneo por padrão e usa fluxos para evitar gravações temporárias no sistema de arquivos, o que pode acelerar consideravelmente sua construção. Gulp é muito idiomático e tem ênfase em código> configuração e, embora isso lhe dê muito poder, não é ideal para equipes que não têm uma competência central em JavaScript.

O único problema potencial para ferramentas baseadas em JavaScript é que você terá que ter Node , npm e grunt-cli / gulp em qualquer máquina que precise fazer a compilação. Se você não tiver acesso às suas máquinas de CI ou não estiver usando implantações baseadas em artefatos, isso pode ser difícil de vender.

Integrar isso ao seu projeto Maven é muito fácil e você tem algumas opções. Você pode usar o plugin Maven ant-run , pode executar uma tarefa ant exec e chamá-la do Maven ou, o melhor de tudo, pode apenas usar a tarefa maven exec .
Abaixo está o código para integrar isso ao ciclo de vida do Maven usando o plug-in exec, se isso for útil para alguém.

    <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
fonte
1
Obrigado pela resposta detalhada. Acho que vou escolher a opção Node Based Tooling. Novo no Grunt, gosto do que vi até agora e seria ótimo se pudesse ter o melhor dos dois mundos. Eu não sabia sobre a existência de WRO4J e JAWR. Obrigado novamente.
nulo em
wro4j integra o processador less4j que é uma implementação baseada em java de less.js, cujo desempenho é comparável ao do node.js nativo.
Alex Objelean
1
O motivo pelo qual wro4j não é tão rápido com node.js é principalmente porque ele requer operações de IO de disco para cada execução. Isso poderia ser melhorado apenas se os processos baseados em node.js (como lessc) permitiriam a compilação de recursos na memória.
Alex Objelean
12
Este processo oferece suporte à falha na Mavenconstrução se a gruntconstrução falhar?
Snekse de
6
Qualquer tarefa exec que não retornar corretamente deve falhar no build. stackoverflow.com/questions/3480162/…
Baer
24

Para quem ainda está procurando por mais informações sobre este tópico, um dos criadores do Yeoman tem um bom artigo (escrito alguns meses depois que esta pergunta foi feita originalmente) que expande a resposta original com um pouco mais de detalhes:

Jeff Smith
fonte
Muito obrigado! Achei esta postagem extremamente útil e era mais o que eu estava procurando,
Ryan J. McDonough
13

Depois, há também o frontend-maven-plugin: https://stackoverflow.com/a/19600777/320399 Ele baixa o Node e o NPM para você (localmente no seu projeto), baixa o Grunt por meio desse NPM (executado por aquele Node) e então executa o Grunt (por meio desse Node). É autoinicializado e você não precisa do Node instalado na máquina para construir o projeto. Apenas um comando; mvn install.

Eirik Sletteberg
fonte
13

Você pode querer verificar http://jhipster.github.io/ : é um gerador Yeoman, que gera um aplicativo que tem Maven, Grunt e Bower todos trabalhando juntos.

É um pouco como sua terceira opção, mas tudo está configurado para você, o que não é tão fácil. Ele também está gerando os serviços AngularJS e Java REST básicos para você.

Julien Dubois
fonte
1
É tarde demais para meu projeto começar com um aplicativo recém-gerado. Mas isso é ótimo e muito útil, vou emprestar algumas das soluções do aplicativo gerado e usar no meu projeto. Obrigado!
Matsemann
2
Na verdade, você só precisa incluir o plug-in yeoman-maven e isso permite que você coloque todas as coisas de configuração do JavaScript (bower, npm, grunt) como irmãos do pom.xml (exatamente onde esses arquivos devem pertencer IMO), e sobre O mvn install irá construir tudo - incluindo seu webapp em src / main / webapp. Levei menos de meia hora para portar um projeto existente para essa estrutura. Claro, você deve dar uma olhada no aplicativo de exemplo em github.com/jhipster/jhipster-sample-app
raven_arkadon
4

depois de algumas horas gastas com esse problema, posso dizer o seguinte:

maven e grunt não tocam bem, mas podem ser aplicados ..

Aqui está uma descrição do plugin para executar o Grunt via compilação Maven

Eu espero que isso ajude :)

Nadav Leshem
fonte
obrigado pela resposta, ajuda sim, mas vou tentar de acordo com a resposta de @Baer.
nulo em
9
a essência referida está morta
Peter Butkovic