Por que maven? Quais são os benefícios? [fechadas]

131

Quais são os principais benefícios do uso do maven em comparação com, digamos, formiga? Parece ser mais um aborrecimento do que uma ferramenta útil. Eu uso o maven 2, com o Eclipse Java EE simples (sem m2eclipse) e o tomcat.

Os defensores do maven acreditam que

  1. O Maven permite que você obtenha facilmente as dependências do seu pacote

  2. O Maven obriga a ter uma estrutura de diretórios padrão

Em minha experiência

  1. Descobrir dependências de pacotes não é realmente tão difícil. Você raramente faz isso de qualquer maneira. Provavelmente uma vez durante a configuração do projeto e mais algumas durante as atualizações. Com o maven, você acabará corrigindo dependências incompatíveis, poms mal escritos e excluindo pacotes de qualquer maneira.

  2. Ciclo lento FIX-COMPILE-DEPLOY-DEBUG, que mata a produtividade. Esta é a minha queixa principal. Você faz uma alteração, precisa aguardar a construção do maven e aguardar a implantação. Nenhuma implantação quente de qualquer natureza.

Ou estou apenas fazendo errado? Por favor, aponte-me para a direção certa, sou todo ouvidos.

trix
fonte
1
Estou realmente interessado no ponto 2. Alguém mais percebe o ciclo lento de correção, compilação e implantação? ou todo mundo sabe, mas fica quieto, já que o maven é o melhor que temos / a coisa mais comum / mais legal. Criar uma guerra / ouvido para implantar já é ruim o suficiente, o maven está piorando. Demora aproximadamente 5 segundos na minha máquina para exibir uma alteração de jsp em um projeto maven, em uma estrutura de diretório explodida? menos de 1 seg. Posso salvar várias vezes e compila apenas as alterações mais recentes no maven? cada salvamento aciona uma compilação.
trix
Talvez não seja o problema aqui, mas o suporte / plugin IDE? No entanto, eu já estou aqui há algum tempo, se não conseguirmos acertar, devemos mudar / inventar / propor outra coisa? além de Ivy
trix
2
@Javid Embora o título da pergunta pareça semelhante, o corpo da pergunta é diferente da IMO e eu não a considero um idiota.
Pascal Thivent
Por um segundo, parecia que você estava falando sobre NuGet ...
micahhoover

Respostas:

108

Descobrir dependências de pacotes não é realmente tão difícil. Você raramente faz isso de qualquer maneira. Provavelmente uma vez durante a configuração do projeto e mais algumas durante as atualizações. Com o maven, você acabará corrigindo dependências incompatíveis, poms mal escritos e excluindo pacotes de qualquer maneira.

Não é tão difícil ... para projetos de brinquedos. Mas os projetos em que trabalho têm muitos, realmente muitos deles, e estou muito feliz em obtê-los de forma transitória, em ter um esquema de nomeação padronizado para eles. Gerenciar tudo isso manualmente manualmente seria um pesadelo.

E sim, às vezes você precisa trabalhar na convergência de dependências. Mas pense duas vezes, isso não é inerente ao Maven, é inerente a qualquer sistema que utilize dependências (e eu estou falando sobre dependências Java em geral aqui).

Portanto, com o Ant, você deve fazer o mesmo trabalho, exceto que você deve fazer tudo manualmente: capturando alguma versão do projeto A e suas dependências, capturando alguma versão do projeto B e suas dependências, descobrindo a si mesmo quais versões exatas eles usam, verificando que eles não se sobrepõem, verificando se não são incompatíveis etc. Bem-vindo ao inferno.

Por outro lado, o Maven suporta o gerenciamento de dependências e as recupera transitivamente para mim e fornece as ferramentas necessárias para gerenciar a complexidade inerente ao gerenciamento de dependências : posso analisar uma árvore de dependências, controlar as versões usadas nas dependências transitivas, excluir alguns dos -los , se necessário, controlar a Converge através dos módulos, etc. não há mágica. Mas pelo menos você tem apoio.

E não esqueça que o gerenciamento de dependências é apenas uma pequena parte do que o Maven oferece, há muito mais (nem mesmo mencionando as outras ferramentas que se integram perfeitamente ao Maven, por exemplo, Sonar ).

Ciclo lento FIX-COMPILE-DEPLOY-DEBUG, que mata a produtividade. Esta é a minha queixa principal. Você faz uma alteração, precisa aguardar a construção do maven e aguardar a implantação. Nenhuma implantação quente de qualquer natureza.

Primeiro, por que você usa o Maven assim? Eu não. Uso meu IDE para escrever testes, códigos até que eles passem, refatore, implemente, implante a quente e execute uma compilação local do Maven quando terminar, antes de confirmar, para garantir que não interrompa a compilação contínua.

Segundo, não tenho certeza se o uso do Ant tornaria as coisas muito melhores. E, de acordo com a minha experiência, as compilações modulares do Maven usando dependências binárias me proporcionam um tempo de compilação mais rápido do que as compilações Ant monolíticas típicas. De qualquer forma, dê uma olhada no Maven Shell para obter um ambiente pronto para (re) usar o Maven (o que é incrível por sinal).

Então, no final, e lamento dizer, não é realmente o Maven que está matando sua produtividade, é o uso indevido de suas ferramentas. E se você não estiver feliz com isso, bem, o que posso dizer, não use. Pessoalmente, estou usando o Maven desde 2003 e nunca mais olhei para trás.

Pascal Thivent
fonte
@ Pascal, você pode dizer quais ferramentas você está usando? IDE, plugins, etc. Você está nos dizendo que, se eu alterar um arquivo .properties ou jsp, ele será implementado a quente sem fazer uma compilação maven? (talvez a implantação a quente não seja o termo correto aqui). Eu não estava claro com o que eu quis dizer com formiga. Eu quis dizer usando o diretório explodido padrão durante o desenvolvimento e use o ant para criar um war / ear antes do lançamento. Para um diretório explodido, as regras são simples, copie / compile arquivos do src para as classes e não toque no resto.
trix
continua ... No entanto, em meus projetos, o que está sendo implantado no tomcat são os jarros dos módulos. Se eu mudar um .jsp, o maven não precisará reconstruir esses jarros?
trix
4
Você deve admitir que a maioria dos projetos são de brinquedo, também conhecidos como dependências simples. Isso é apenas lei da estatística.
trix
2
@trix, sobre hot deploy ant vs. maven: se você não está fazendo o ant build para hot deploy, por que está usando o Maven para o mesmo? Eu acho que se você usar formiga para o mesmo, levaria pelo menos a mesma quantidade de tempo ... não é?
285
2
Então, Pascal, você poderia nos dizer como você tem um projeto configurado para a natureza do Maven e não usa o processo de construção para implantar? Este é o ponto 2 da pergunta inicial. Gostaria de saber como fazer isso, então aprecie muito se você puder nos dar uma explicação clara.
20

O Maven pode ser considerado uma ferramenta completa de desenvolvimento de projeto, não apenas uma ferramenta de construção como o Ant. Você deve usar o Eclipse IDE com o plugin maven para corrigir todos os seus problemas.

Aqui estão algumas vantagens do Maven, citadas na página Benefícios do uso do Maven :

Henning

  • configuração rápida do projeto, nenhum arquivo build.xml complicado, apenas um POM e pronto
  • todos os desenvolvedores em um projeto usam as mesmas dependências de jar devido ao POM centralizado.
  • obter vários relatórios e métricas para um projeto "de graça"
  • reduza o tamanho das distribuições de origem, porque os frascos podem ser puxados de um local central

Emmanuel Venisse

  • muitos objetivos estão disponíveis; portanto, não é necessário desenvolver alguma parte específica do processo de construção, ao contrário do ANT, podemos reutilizar as tarefas existentes do ANT no processo de construção com o plugin antrun

Jesse Mcconnell

  • Promove o design modular do código. simplificando o gerenciamento de vários projetos, ele permite que o design seja dividido em várias partes lógicas, unindo essas partes através do uso de rastreamento de dependência em arquivos pom.
  • Impõe o design modular do código. é fácil prestar serviço ao código modular, mas quando o código está em projetos de compilação separados, é impossível cruzar as referências de polinização entre os módulos de código, a menos que você o permita especificamente no gerenciamento de dependências ... faça isso agora e corrija as implementações posteriores.
  • O Gerenciamento de Dependências está claramente declarado. com o mecanismo de gerenciamento de dependências, você precisa tentar estragar o controle de versão do jar ... não existe o problema clássico de 'qual versão desse jar do fornecedor é essa?' E configurá-lo em um projeto existente retira a parte superior da bagunça existente, se existir quando você for forçado a criar versões 'desconhecidas' em seu repositório para colocar as coisas em funcionamento ... ou mentir para si mesmo que conhece o versão atual do ABC.jar.
  • ciclo de vida tipificado forte, existe um ciclo de vida definido forte pelo qual um sistema de software percorre desde o início de uma construção até o fim ... e os usuários podem misturar e combinar seu sistema com o ciclo de vida, em vez de montar seu próprio ciclo de vida. isso tem o benefício adicional de permitir que as pessoas passem de um projeto para outro e falem usando o mesmo vocabulário em termos de criação de software

Vincent Massol

  • Maior impulso: o Ant agora é legado e não está avançando rapidamente. O Maven está avançando rapidamente e existe o potencial de ter muitas ferramentas de alto valor em torno do Maven (CI, projeto de painel, integração de IDE etc.).
YoK
fonte
5
Durante a votação baixa, forneça o motivo, que não é dito, mas a regra ética sobre o stackoverflow.
YoK 28/08/10
1
Não há nada errado com as referências, mas você realmente precisa deixar claro que o conteúdo não é seu.
Pascal Thivent 30/08/10
Obrigado. Vou me certificar de citá-lo além de apenas mencionar de onde foi referenciado. apenas 30 dias ímpares no stackoverflow e ainda aprendendo a arte :).
YoK 30/08/10
11

Descobrir dependências para pequenos projetos não é difícil. Mas quando você começa a lidar com uma árvore de dependência com centenas de dependências, as coisas podem facilmente sair do controle. (Estou falando da experiência aqui ...)

O outro ponto é que, se você usar um IDE com compilação incremental e suporte ao Maven (como Eclipse + m2eclipse), deverá poder configurar a edição / compilação / implementação e teste a quente.

Pessoalmente, não faço isso porque passei a desconfiar desse modo de desenvolvimento devido a más experiências no passado (antes do Maven). Talvez alguém possa comentar se isso realmente funciona com o Eclipse + m2eclipse.

Stephen C
fonte
Pode-se começar com o maven para obter todas as dependências e depois copiar as dependências para o projeto dele, certo?
Trix
2
Suponho que você poderia. Mas isso poderia ser interrompido se você atualizasse as dependências do seu projeto ... ou se o seu projeto dependesse de instantâneos.
Stephen C
Quero dizer, tenho 2 projetos, o único objetivo do projeto maven é obter dependências. Use o controle de versão para acompanhar as alterações entre as atualizações de dependência. Eu faço isso de qualquer maneira, apenas para que eu possa ver as alterações, caso isso interrompa minha compilação.
trix
4
Ughh. Não é assim que o Maven é projetado para ser usado. Um dos grandes benefícios do Maven é evitar a verificação de bibliotecas dependentes no controle de versão. Com sua abordagem, você sobrecarregará seu VCS com muitas versões de muitos arquivos binários. E alguns VCSs são particularmente ruins no manuseio de arquivos binários.
Stephen C
2
Geralmente você aprende a maneira mais difícil de se cansar de qualquer tipo de mágica ao escrever programas: -S
Thorbjørn Ravn Andersen
9

O Maven é uma das ferramentas em que você precisa decidir de antemão que gosta e quer usá-lo, já que você passará algum tempo aprendendo e, tendo tomado a decisão de uma vez por todas, você poderá pular todos os tipos de dúvida enquanto aprende (porque você gosta e quer usá-lo)!

As fortes convenções ajudam em muitos lugares - como Hudson, que pode fazer maravilhas nos projetos Maven -, mas pode ser difícil de ver inicialmente.

editar: A partir de 2016, o Maven é a única ferramenta de construção Java em que os três principais IDEs podem usar as fontes prontas para uso. Em outras palavras, o uso do maven torna sua compilação independente de IDE. Isso permite, por exemplo, usar o perfil do Netbeans, mesmo se você trabalha normalmente no eclipse.

Thorbjørn Ravn Andersen
fonte
1
E o oposto também é verdadeiro, um monte de pessoas vêm para maven com ódio preconcebida, porque não é formiga, etc.
Goibniu
O oposto? Você quer dizer?
Thorbjørn Ravn Andersen
9

Maven vantagens sobre formiga são algumas. Eu tento resumi-los aqui.

Convenção sobre configuração O
Maven usa uma abordagem distinta para o layout e a inicialização do projeto, facilitando o salto em um projeto. Geralmente, são necessários apenas o checkpoint e o comando maven para obter os artefatos do projeto.

Modularização do
projeto As convenções do projeto sugerem (ou melhor, forçam) o desenvolvedor a modularizar o projeto. Em vez de um projeto monolítico, você geralmente é forçado a dividir seu projeto em subcomponentes menores, o que facilita a depuração e o gerenciamento da estrutura geral do projeto

Gerenciamento de dependências e ciclo de vida do projeto
Em geral, com uma boa configuração do SCM e um repositório interno, o gerenciamento de dependências é bastante fácil e você é novamente forçado a pensar em termos do ciclo de vida do projeto - versões de componentes, gerenciamento de lançamento e assim por diante. Um pouco mais complexo do que a formiga alguma coisa, mas, novamente, uma melhoria na qualidade do projeto.

O que há de errado com maven?
Maven não é fácil. O ciclo de construção (o que é feito e quando) não é tão claro no POM. Além disso, surgem alguns problemas com a qualidade dos componentes e as dependências ausentes nos repositórios públicos.
A melhor abordagem (para mim) é ter um repositório interno para armazenar em cache (e manter) dependências e aplicar ao gerenciamento de liberação de componentes. Para projetos maiores que os projetos de amostra de um livro, você agradecerá ao maven antes ou depois

Luca Botti
fonte
6

O Maven pode fornecer benefícios para o seu processo de construção, empregando convenções e práticas padrão para acelerar seu ciclo de desenvolvimento e, ao mesmo tempo, ajudando você a obter uma taxa mais alta de sucesso. Para uma visão mais detalhada de como o Maven pode ajudá-lo em seu processo de desenvolvimento, consulte Os benefícios do uso do Maven.

user433555
fonte
3

O Maven é uma poderosa ferramenta de gerenciamento de projetos baseada no POM (modelo de objeto do projeto). É usado para construção, dependência e documentação de projetos. Simplifica o processo de compilação como o ANT. Mas é muito avançado que o ANT. O Maven ajuda a gerenciar - Construções, Documentação, Relatórios, SCMs, Lançamentos, Distribuição. - maven repository é um diretório do arquivo JAR empacotado com o arquivo pom.xml. O Maven pesquisa dependências nos repositórios.

Nikhil Pahariya
fonte
2

Eu nunca me deparei com o ponto 2? Você pode explicar por que você acha que isso afeta a implantação de alguma maneira. Se alguma coisa acontecer, você poderá estruturar seus projetos de uma maneira modularizada, que realmente permita correções para bugs em uma determinada camada e permita o desenvolvimento independente de uma API a partir do restante do projeto, por exemplo.

É possível que você esteja tentando compactar tudo em um único módulo; nesse caso, o problema não é realmente sério, mas da maneira como você o está usando.

Goibniu
fonte
Estou usando plain eclipse jee, maven 2 e tomcat. Obviamente, um aplicativo da web. Se estou alterando um arquivo de propriedades, ou um jsp, para ver minhas alterações no tomcat, o maven precisa fazer sua compilação, criar um war / ear e implantar no tomcat. Isso é lento em comparação com o uso de uma estrutura de diretório explodida.
trix
1
O @trix Hot deploy no Eclipse com Tomcat simplesmente funciona. Você está fazendo isso errado.
Pascal Thivent
0

Isso deveria ter sido um comentário, mas não cabia no tamanho de um comentário, então eu o publiquei como resposta.

Todos os benefícios mencionados em outras respostas são alcançáveis ​​por meios mais simples do que usar o maven. Se, por exemplo, você é novo em um projeto, de qualquer forma, passará mais tempo criando a arquitetura do projeto, juntando componentes, codificando do que baixando jarros e copiando-os para a pasta lib. Se você tem experiência em seu domínio, já sabe como iniciar o projeto com quais bibliotecas. Não vejo nenhum benefício em usar o maven, especialmente quando ele apresenta muitos problemas ao executar automaticamente o "gerenciamento de dependências".

Eu só tenho conhecimento de nível intermediário do maven, mas digo-lhe, fiz grandes projetos (como ERPs) sem usar o maven.

Syed Aqeel Ashiq
fonte