Maven: Ciclo de vida x fase x plug-in x objetivo [fechado]

106

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!

Jeff Levine
fonte
Obrigado @Drejc - não acredito que não achei isso na minha pesquisa. Vou ler agora.
Jeff Levine
2
Portanto, para esclarecer, build lifecycle = lifecycle , dos quais existem três tipos: default, clean e site? Outras explicações me fizeram pensar que havia um quarto ciclo de vida chamado build .
Jeff Levine
3
Muito amplo? Isso diz respeito aos fundamentos básicos do Maven e tem algumas respostas boas e detalhadas. Moderadores sem uma única marca maven não deveriam ter permissão para decidir isso.
Gerold Broser

Respostas:

73

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 mvnsem qualquer fase ou objetivo [com quebras de linha e abreviadas para facilitar a leitura aqui]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

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.xmlno 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.xmlsob .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.

Gerold Broser
fonte
41

Maven: Ciclo de Vida vs. Fase vs. Plugin vs. Objetivo

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 insira a descrição da imagem aqui

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:

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

Por exemplo, teríamos:

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

O que de fato significa (por meio de diferentes níveis de granularidade):

  • durante a compilefase (não mencionado, infelizmente)>
  • Estou invocando o plugin do compilador Maven ( artifactIde version)>
  • Estou invocando seu compileobjetivo>
  • conforme definido pela default-compileexecuçã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 a test-compilefase (uma fase diferente) para compilar o código de teste (por meio de seu testCompileobjetivo) 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-plugincom o mesmo default-compileid, 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.xmlconfiguração, você pode adicionar coisas (execuções) ao build ou influenciar o comportamento de plug-ins já configurados (neste caso, nenhuma executionsseção, mas configurationseria 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:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(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 packagee 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).

A_Di-Matteo
fonte
18

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:

  • Ciclo de vida vs fase
  • Plugin vs Objetivo

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

mvn clean

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:

mvn clean:clean

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:

mvn clean

Chamará a fase de pré-limpeza e a fase de limpeza que se conecta ao objetivo limpo: limpo.

É quase o mesmo que:

mvn pre-clean clean:clean
Surasin Tancharoen
fonte
1
@ 2. & 3. IMHO, clean:cleannão é a melhor escolha para um exemplo. Existem 4 itens nomeados clean(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 ".
Gerold Broser
@GeroldBroser. Concordo totalmente com limpo: limpo. Já havia explicado e avisado isso na minha explicação completa no link. Vou copiar esses avisos para aqui também. A razão pela qual eu usei é porque é bom deixar as pessoas saberem sobre essa palavra confusa e, principalmente, o documento oficial do maven está usando e isso explica claramente. E sim, estava me confundindo também. De qualquer forma, muito obrigado pelos comentários
Surasin Tancharoen
erro de digitação: o documento oficial do maven está usando e não o explica claramente
Surasin Tancharoen
17

E tardiamente outro diagrama

  • Ciclos de vida como retângulos amarelos
  • Fases de ciclos de vida como retângulos azuis com fases "chamáveis" em azul mais escuro (ou seja, as fases com hifenização geralmente não são chamadas a partir da linha de comando, pois podem não ser projetadas para deixar o projeto em um estado bem definido).
  • Objetivos como losangos azuis. A associação / ligação "fase -> objetivo" mostrada é aquela do modo de empacotamento "jar" . Cada fase pode ter objetivos vinculados a ela. Isso é válido para cada um dos ciclos de vida, embora as ligações sejam mostradas apenas para o ciclo de vida "padrão".
  • Plugins como retângulos cinza cortados. Os plug-ins fornecem as metas que podem ser vinculadas às fases.

Ciclos de vida, fases, metas e plug-ins do Maven

David Tonhofer
fonte
O arquivo graphml (editado com o editor yEd gratuito) está disponível em github.com/dtonhofer/diagrams
David Tonhofer
1) O que você quer dizer exatamente com „ " fases exigíveis " “ que estão " em um azul mais escuro "? Cada fase do Maven é "chamável" (embora eu prefira chamá-la de invocável , já que não há código chamado diretamente ao invocar uma fase). Ou você chama as fases de " exigíveis " que têm um objetivo vinculado a ela (por padrão)? Nem mesmo isso é verdade, se você olhar para validate, initializee verify.
Gerold Broser
2) O resources:[testR|r]esourcesobjetivo NÃO está vinculado às fases process-sourcesou process-test-sourcesdo jarciclo de vida .
Gerold Broser
3) modello:javado Modello Plugin aparentemente é específico do domínio. Vincular o objetivo de um plugin a uma fase vale para qualquer uma das fases.
Gerold Broser
@GeroldBroser Corrigido de acordo com comentários. "Callable" significa que pode-se chamá-lo da linha de comando e esperar que o projeto permaneça em um estado válido. Não há nenhuma distinção significativa entre chamar e invocar e chamar é o que a Introdução do Maven usa.
David Tonhofer
12

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.

  • O comando Maven mvn pode aceitar apenas Lifecycle Phase ou Plugin Goal como argumento.
  • O Maven vem com três ciclos de vida - padrão, limpo e local.
  • Cada ciclo de vida é composto de fases do ciclo de vida e ao todo, há 28 fases - padrão 21 ( validar, ..., compilar, ..., empacotar, ..., instalar, implantar ), limpar 3 ( pré-limpar, limpo, pós-limpeza ) e local 4 ( pré-local, local, pós-local, implantação local ).
  • quando uma fase do ciclo de vida é chamada usando o comando mvn, todas as fases anteriores são executadas sequencialmente, uma após a outra.
  • As fases do ciclo de vida por si só não têm recursos para realizar algumas tarefas e contam com plug-ins para realizar a tarefa.
  • dependendo do projeto e do tipo de pacote, o Maven vincula vários objetivos do plugin às fases do ciclo de vida e os objetivos realizam a tarefa confiada a eles.

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.

mvn-plugins-package-goal

Erlan
fonte
1
O material que você mencionou é muito bom. Obrigado!
William Kinaan
@ " O comando Maven mvn pode aceitar apenas Lifecycle Phase ou Plugin Goal como argumento. " Não está correto. Ele também aceita opções .
Gerold Broser
" Quando executamos o" pacote mvn "em um projeto Java, o Maven vincula os objetivos do plugin às fases do ciclo de vida " não é verdade. A vinculação de metas acontece muito antes da execução mvn ...: em default-bindings.xml ou em um POM e não é feita pelo Maven, mas por um ser humano.
Gerold Broser
7

Então, para explicar um pouco mais conforme descrito aqui

As compilações do Maven são divididas em ciclos de vida:

  • limpar \ limpo
  • construir (padrão)
  • local

Cada um desses ciclos é dividido em fases. Por exemplo, a construção é dividida em fases como:

  • preparar recursos
  • compilar
  • pacote
  • instalar

Fases ter metas para executar antes pré ou após o pós- fase um, por exemplo:

  • pré-limpeza - será executado antes da fase de limpeza
  • pós-limpeza - será executado após a fase de limpeza

Você pode ver as metas como fases "inseridas" adicionais, se desejar. Leia aqui ou dê uma olhada na resposta da @Gerolds para detalhes.

Drejc
fonte
1
Esta resposta não está correta em sua totalidade. Veja minha resposta .
Gerold Broser de
Oh garoto, 3 anos desde que você respondeu esta pergunta ... e ainda não largando .. você ganhou ... agora segue em frente
Drejc
Não se trata de vencer. Você não revisa perguntas, respostas e comentários antigos se os encontrar mais tarde?
Gerold Broser
3

LifeCycle vs Phases: Life Cycle é uma coleção de phases. 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:

  1. Ciclo de vida limpo - envolve a limpeza do projeto (para uma nova construção e implantação)
  2. Ciclo de vida padrão / construção - trata da implantação completa do projeto
  3. Ciclo de vida do site - trata da geração da documentação java do projeto. insira a descrição da imagem aqui

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.

Arun Raaj
fonte
Seu último parágrafo é enganoso. Principalmente a primeira e a última frase. Metas e fases são coisas totalmente diferentes. Você não deve confundi-los porque alguns deles têm nomes idênticos. Re " Metas são as fases que você vê na imagem acima. ": Não há uma única meta mencionada na imagem. Todas essas são fases . Re " Você escreve o nome da fase como 'objetivo' quando tem que realizar determinado objetivo. ": Embora seja possível executar o objetivo de um plugin explicitamente, a maneira usual é realizar uma construção até uma determinada fase com mvn <phase>. Veja minha resposta aqui.
Gerold Broser
Obrigado, removi a parte "Plug-in vs Goal". Vou atualizá-lo em breve.
Arun Raaj