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
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
compile
fase (não mencionado, infelizmente)>
- Estou invocando o plugin do compilador Maven (
artifactId
e version
)>
- Estou invocando seu
compile
objetivo>
- conforme definido pela
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 a test-compile
fase (uma fase diferente) para compilar o código de teste (por meio de seu testCompile
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 mesmo default-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, nenhuma executions
seção, mas configuration
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:
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 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).