Desenvolvedor relativamente novo aqui, embora já esteja usando há algum tempo, espero solidificar meus fundamentos do Maven. Parte do meu problema é que eu tenho nenhuma experiência com Ant, que parece ser de onde derivam muitas explicações. Tenho lido e assistido tutoriais e continuo ouvindo os mesmos termos:
- Ciclo da vida
- Estágio
- Plugar
- Objetivo
Pelo que aprendi, parece que o ciclo de vida é o mais amplo do grupo e é composto de (ou completado por) fases, plug-ins e / ou objetivos.
Pergunta : Você poderia fornecer alguma informação sobre como esses termos estão relacionados e os exemplos mais comuns?
Quanto mais explícito e básico, melhor!
maven
maven-3
pom.xml
maven-lifecycle
Jeff Levine
fonte
fonte
Respostas:
Um ciclo de vida do Maven é um conceito (abstrato) que cobre todas as etapas (ou melhor: todas as etapas que os designers do Maven decidiram apoiar) que devem ocorrer durante o desenvolvimento do projeto. Essas etapas (ou estágios) são chamados de fases na terminologia do Maven.
Um plugin Maven é um contêiner para / fornecedor de metas. O código implementado em metas é o verdadeiro burro de carga. ( Maven em seu próprio núcleo é apenas gerenciar plugins e executar metas ). Cada um dos objetivos de um plugin pode ser atribuído / vinculado a qualquer uma das fases do ciclo de vida.
Ao invocar, o
mvn <phase>
Maven passa todas as fases (todas as vezes) e executa todos os objetivos (fornecidos por plug-ins) que foram vinculados a qualquer uma das fases anteriores e até (e incluindo) a fase fornecida. Se houver uma fase sem objetivo vinculado a ela, nada será feito. Mas a fase já passou.Ou seja, você não pode "inserir 'fases adicionais" em um dos ciclos de vida integrados do Maven. Eles já estão aí, sempre! Você poderia desenvolver seu próprio ciclo de vida com suas próprias fases, mas isso vai muito além de simplesmente usar o Maven como ele é.
As metas também podem ser executadas diretamente, que você recebe ao executar
mvn
sem qualquer fase ou objetivo [com quebras de linha e abreviadas para facilitar a leitura aqui]:Referências:
Se você já se perguntou como o Maven sabe o que fazer sem nenhum vínculo de objetivo no POM, há um link para
default-bindings.xml
no final que está localizado em<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml
.As fases dos ciclos de vida de embutidos ( limpo , padrão , do site ) são declarados no
<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xml
sob.../<component>/<role>org.apache.maven.lifecycle.Lifecycle
.fonte
Respondendo tarde apenas para esclarecer outro nível de granularidade ausente neste segmento: execuções (de um objetivo), que são as menores unidades de uma construção Maven.
Portanto, temos ciclos de construção (basicamente, conjunto de ações para um objetivo geral específico), que consistem em fases (menor granularidade, uma etapa do ciclo), que podem invocar um conjunto de objetivos configurados fornecidos por determinados plug - ins . Ou seja, o Maven é (também) um executor de plugin, cada plugin pode oferecer um ou mais objetivos. Você então (também) decide qual objetivo está vinculado a qual fase, na maioria das vezes no ciclo de vida padrão (sem nenhum, isto é, o padrão). Mas você pode realmente ter outro nível: execuções (do mesmo objetivo, do mesmo plug-in ou de objetivos diferentes de plug-ins diferentes)
Uma imagem que preparei para resumir o todo
E, de fato, é assim que o Maven o mostra (sua menor unidade de trabalho) por meio da string exclusiva em seu log de construção:
Por exemplo, teríamos:
O que de fato significa (por meio de diferentes níveis de granularidade):
compile
fase (não mencionado, infelizmente)>artifactId
eversion
)>compile
objetivo>default-compile
execuçãoÉ único porque na verdade você poderia ter o mesmo objetivo (do mesmo plugin) vinculado a diferentes fases ou à mesma fase, mas em execuções diferentes (ou seja, com configurações diferentes). O
maven-compiler-plugin
, por exemplo, também é usado durante atest-compile
fase (uma fase diferente) para compilar o código de teste (por meio de seutestCompile
objetivo) em uma execução diferente (default-testCompile
). Você também pode compilar (usando o mesmo plug-in e objetivo) algum código gerado automaticamente durante uma fase diferente, conforme definido por uma execução especificada no POM (e potencialmente uma configuração diferente).As execuções padrão são fornecidas prontas para uso por meio de vínculos de empacotamento do Maven , ou seja, por padrão (e reforçando a convenção sobre a configuração) o Maven já invoca certos objetivos (de plug-ins padrão) durante certas fases. Os ids de execução dessas invocações padrão são definidos de acordo com certas convenções .
Isso também explica porque se você realmente deseja substituir um comportamento padrão (vinculação) de uma construção Maven, você precisa especificar (substituir) exatamente o mesmo ID de execução em seu POM para o mesmo plugin. Você poderia, por exemplo, pular a compilação simplesmente definindo uma execução de
maven-compiler-plugin
com o mesmodefault-compile
id, mas vinculado a uma fase não existente (ou vazia).Para resumir : uma execução diz ao Maven quais objetivos executar com qual configuração em qual fase.
Algumas execuções são fornecidas por padrão (ligações padrão), o que explica porque o pom mínimo maven de apenas 6 linhas já pode fazer muito (compilar, testar, pacote, etc.): executar objetivos de plug-ins padrão em certas fases: é convenção sobre configuração. Então, por meio da
pom.xml
configuração, você pode adicionar coisas (execuções) ao build ou influenciar o comportamento de plug-ins já configurados (neste caso, nenhumaexecutions
seção, masconfiguration
seria o suficiente).Sim, você pode pular os ciclos de construção (e suas fases) e invocar diretamente os objetivos (dos plug-ins). Imagine o seguinte:
(NOTA: você também pode chamar inline em apenas uma chamada)
Aqui estamos compilando o código do aplicativo, o código de teste, os testes de execução e o pacote: imagine como isso seria manual, sujeito a erros, repetitivo e demorado. A convenção sobre a configuração nos ajuda: o Maven apresenta os ciclos e fases de vida da construção . O ciclo de vida padrão (sem nome, ou seja, o padrão), fornece uma gama de fases com base nas melhores práticas e convenções (o mantra do Maven).
Se você deseja obter o mesmo que acima, simplesmente execute:
mvn package
e ele irá compilar, testar e empacotar automaticamente seu projeto. Quão? invocando plug-ins. Ou seja, as fases são um conjunto significativo e configurável de execuções de plug-ins (objetivos). Para torná-lo ainda mais padrão, para cada fase o Maven irá primeiro invocar qualquer fase anterior, de forma que, por exemplo, se você quiser testar, tenha certeza de compilar primeiro.ps note que ao especificar vários objetivos para o mesmo
execution
, você ainda verá claramente no log de construção duas execuções diferentes (com o mesmo id) para os dois objetivos diferentes (portanto, tupla ainda única).fonte
Crédito para Sandeep Jindal e Premraj (a partir daqui, quais são os objetivos e fases do Maven e quais são suas diferenças? ). A explicação deles me ajuda a entender.
Criei alguns exemplos de código completos e algumas explicações simples aqui https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Acho que pode ajudar outras pessoas a entender e tentar algo diretamente.
Resumindo, a partir do link, você não deve tentar entender todos os três ao mesmo tempo, primeiro você deve entender a relação nestes grupos:
1. Ciclo de vida vs fase
O ciclo de vida é uma coleção de fases em sequência, veja aqui as referências do ciclo de vida . Quando você chama uma fase , ela também chama todas as fases anteriores.
Por exemplo, o ciclo de vida limpo tem 3 fases ( pré-limpeza, limpeza, pós-limpeza ).
Isso chamará de pré-limpeza e limpeza .
2. Plugin vs Objetivo
O objetivo é como uma ação no plug-in . Portanto, se o plugin é uma classe, o objetivo é um método.
você pode chamar uma meta como esta:
Isso significa "chamar a meta limpa, no plug-in de limpeza" (nada se relaciona à fase de limpeza aqui. Não deixe a palavra "limpar" confundir você, elas não são a mesma coisa! Veja a explicação completa no meu link acima)
3. Agora, a relação entre fase e objetivo:
A fase pode (pré) vincular a meta (s). Por exemplo, normalmente, a fase limpa se vincula à meta limpa. Então, quando você chama este comando:
Chamará a fase de pré-limpeza e a fase de limpeza que se conecta ao objetivo limpo: limpo.
É quase o mesmo que:
fonte
clean:clean
não é a melhor escolha para um exemplo. Existem 4 itens nomeadosclean
(ciclo de vida, fase, plugin, objetivo) que podem ser confusos, especialmente para iniciantes (lembro que era para mim no início). @ 3. O verbo "vincular" também não é uma boa escolha, IMHO. O termo oficial do Maven é " vincular ".E tardiamente outro diagrama
fonte
validate
,initialize
everify
.resources:[testR|r]esources
objetivo NÃO está vinculado às fasesprocess-sources
ouprocess-test-sources
dojar
ciclo de vida .modello:java
do Modello Plugin aparentemente é específico do domínio. Vincular o objetivo de um plugin a uma fase vale para qualquer uma das fases.Fonte este é um tutorial muito bom
Ciclos de vida, fases do ciclo de vida, plug-ins e metas de plug-in são o núcleo do Maven.
Quando executamos o " pacote mvn " em um projeto Java, o Maven vincula os objetivos do plug-in às fases do ciclo de vida, conforme mostrado na próxima figura.
fonte
mvn ...
: em default-bindings.xml ou em um POM e não é feita pelo Maven, mas por um ser humano.Então, para explicar um pouco mais conforme descrito aqui
As compilações do Maven são divididas em ciclos de vida:
Cada um desses ciclos é dividido em fases. Por exemplo, a construção é dividida em fases como:
Fases ter metas para executar antes pré ou após o pós- fase um, por exemplo:
Você pode ver as metas como fases "inseridas" adicionais, se desejar. Leia aqui ou dê uma olhada na resposta da @Gerolds para detalhes.
fonte
LifeCycle vs Phases:
Life Cycle
é uma coleção dephases
. Quando você chama uma fase, ela também chama todas as fases anteriores. O Maven vem com 3 ciclos de vida de construção integrados como:O ciclo de vida da limpeza tem 3 fases: pré-limpeza, limpeza e pós-limpeza. As fases do ciclo de vida padrão e do site são as mesmas mostradas na imagem.
fonte
mvn <phase>
. Veja minha resposta aqui.