Qual é a diferença / relação entre os objetivos e fases do Maven? Como eles estão relacionados um com o outro?
Qual é a diferença / relação entre os objetivos e fases do Maven? Como eles estão relacionados um com o outro?
Respostas:
Os objetivos são executados em fases que ajudam a determinar a ordem em que os objetivos são executados. O melhor entendimento disso é examinar as ligações padrão do ciclo de vida do Maven, que mostram quais objetivos são executados em quais fases, por padrão. Os objetivos da fase de compilação sempre serão executados antes dos objetivos da fase de teste, que sempre serão executados antes dos objetivos da fase do pacote e assim por diante.
Parte da confusão é exacerbada pelo fato de que, quando você executa o maven, pode especificar um objetivo ou uma fase. Se você especificar uma fase, o maven executará todas as fases até a fase especificada em ordem (por exemplo, se você especificar o pacote, ele primeiro executará a fase de compilação e, em seguida, a fase de teste e, finalmente, a fase do pacote) e, para cada fase, executar todas as metas associadas a essa fase.
Quando você cria uma execução de plug-in no arquivo de construção do Maven e especifica apenas o objetivo, ele o vincula a uma determinada fase padrão. Por exemplo, o objetivo jaxb: xjc é vinculado por padrão à fase generate-resources. No entanto, quando você especifica a execução, também pode especificar explicitamente a fase para esse objetivo.
Se você especificar um objetivo ao executar o Maven, ele executará esse objetivo e somente esse objetivo. Em outras palavras, se você especificar o objetivo jar: jar, ele executará apenas o objetivo jar: jar para empacotar seu código em um jar. Se você não executou a meta de compilação anteriormente ou preparou seu código compilado de alguma outra maneira, isso provavelmente poderá falhar.
mvn archetype:generate
, e nesse caso o maven apenas executa o objetivo?
mvn test
runs:, --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:test
enquanto mvn compiler:testCompile
apenas executa --- maven-compiler-plugin:3.1:testCompile ...
.
mvn clean compiler:testCompile
é executado --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
com falha Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase
(onde MvnPhase
está a classe em teste referenciada na classe de teste). Aparentemente, as fases não são invocadas se uma meta for invocada explicitamente.
Ciclo de vida é uma sequência de fases nomeadas .
As fases são executadas sequencialmente. Executar uma fase significa executar todas as fases anteriores.Plug-in é um conjunto de objectivos , também chamado MOJO ( M aven O ld J ava O bject).
Analogia: Plugin é uma classe e objetivos são métodos dentro da classe.
O Maven é baseado no conceito central de um Build Life Cycles . Dentro de cada Ciclo de Vida da Construção, existem Fases de Construção , e dentro de cada Fase de Construção, existem Metas de Construção .
Podemos executar uma fase de construção ou meta de construção. Ao executar uma fase de construção, executamos todos os objetivos de construção nessa fase de construção. Metas de construção são atribuídas a uma ou mais fases de construção. Também podemos executar uma meta de construção diretamente.
Existem três principais Ciclos de Vida de Construção integrados :
Cada ciclo de vida da compilação é composto de fases
Por exemplo, o default
ciclo de vida compreende as seguintes fases de construção :
◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
Então, para passar pelas fases acima, basta chamar um comando:
mvn <phase> { Ex: mvn install }
Para o comando acima, iniciando na primeira fase, todas as fases são executadas seqüencialmente até a fase 'install'. mvn
pode executar um objetivo ou uma fase (ou até vários objetivos ou várias fases) da seguinte maneira:
mvn clean install plugin:goal
No entanto, se você desejar personalizar o prefixo usado para referenciar seu plug-in, poderá especificar o prefixo diretamente através de um parâmetro de configuração no POM domaven-plugin-plugin
seu plug-in.
Uma fase de criação é composta de objetivos de plug-in
A maioria das funcionalidades do Maven está em plugins. Um plug-in fornece um conjunto de objetivos que podem ser executados usando a seguinte sintaxe:
mvn [plugin-name]:[goal-name]
Por exemplo, um projeto Java pode ser compilado com o objetivo de compilação do plug-in do compilador executando mvn compiler:compile
.
O ciclo de vida da construção é uma lista de fases nomeadas que podem ser usadas para dar ordem à execução do objetivo.
As metas fornecidas pelos plug-ins podem ser associadas a diferentes fases do ciclo de vida. Por exemplo, por padrão, a meta compiler:compile
está associada à compile
fase , enquanto a meta surefire:test
está associada à test
fase . Considere o seguinte comando:
mvn test
Quando o comando anterior é executado, o Maven executa todos os objetivos associados a cada uma das fases, incluindo a test
fase. Nesse caso, o Maven executa a resources:resources
meta associada à process-resources
fase compiler:compile
e assim sucessivamente até finalmente executar a surefire:test
meta.
No entanto, mesmo que uma fase de construção seja responsável por uma etapa específica no ciclo de vida da construção, a maneira como ela executa essas responsabilidades pode variar. E isso é feito declarando os objetivos do plugin vinculados a essas fases de construção.
Uma meta de plug-in representa uma tarefa específica (mais fina que uma fase de construção) que contribui para a construção e o gerenciamento de um projeto. Pode estar vinculado a zero ou mais fases de construção. Uma meta não vinculada a nenhuma fase de construção pode ser executada fora do ciclo de vida da construção por chamada direta. A ordem de execução depende da ordem na qual a meta (s) e a (s) fase (s) de construção são invocadas. Por exemplo, considere o comando abaixo. Os argumentos clean
e package
são fases de construção, enquanto o dependency:copy-dependencies
é uma meta (de um plugin).
mvn clean dependency:copy-dependencies package
Se isso for executado, a clean
fase será executada primeiro (o que significa que executará todas as fases anteriores do ciclo de vida limpo, mais a clean
própria fase) e, em seguida, o dependency:copy-dependencies
objetivo, antes de finalmente executar opackage
fase (e todas as fases anteriores de construção de o ciclo de vida padrão).
Além disso, se um objetivo estiver vinculado a uma ou mais fases de construção, esse objetivo será chamado em todas essas fases.
Além disso, uma fase de construção também pode ter zero ou mais metas vinculadas a ela. Se uma fase de construção não tiver objetivos vinculados a ela, essa fase de execução não será executada. Mas se tiver um ou mais objetivos vinculados, ele executará todos esses objetivos.
Ligações do ciclo de vida incorporadas
Algumas fases têm objetivos vinculados a elas por padrão. E para o ciclo de vida padrão, essas ligações dependem do valor da embalagem.
Arquitetura Maven:
Amostra Eclipse para Mapeamento do Ciclo de Vida do Maven
[plugin-name]
no exemplo mvn [plugin-name]:[goal-name]
é um prefixo de plug - in . mvn clean install
não pode apenas " ser usado em um cenário de vários módulos ". O multi-módulo é um tópico totalmente diferente.
A resposta escolhida é ótima, mas ainda assim gostaria de acrescentar algo pequeno ao tópico. Uma ilustração.
Isso demonstra claramente como as diferentes fases se vinculam a diferentes plugins e os objetivos que esses plugins expõem.
Então, vamos examinar um caso de executar algo como mvn compile
:
mvn compile
é mapeado para uma meta específica, a meta de compilação.mvn compiler:compile
Portanto, a fase é composta de objetivos do plug-in .
Link para a referência
mvn test
apontando package
e mvn install
apontando deploy
?
jar
plug - in é executado na package
fase. E o pom no sanduíche entre as fases e os plugins é um pouco confuso (suponho que deva significar que no pom você pode configurar quais plugins são executados em quais fases, além das ligações padrão). O princípio geral está certo, no entanto.
As definições estão detalhadas na página do site do Maven Introdução ao ciclo de vida da construção , mas tentei resumir :
O Maven define 4 itens de um processo de construção:
Ciclo da vida
Três built-in ciclos de vida (aka ciclos de vida de compilação ): default
, clean
, site
. ( Referência do ciclo de vida )
Estágio
Cada ciclo de vida é composta por fases de , por exemplo, para o default
ciclo de vida: compile
, test
, package
, install
, etc.
Plugar
Um artefato que fornece um ou mais objetivos.
Com base no tipo de embalagem ( jar
, war
etc.), os objetivos dos plug-ins estão vinculados às fases por padrão. ( Ligações do ciclo de vida incorporadas )
Objetivo
A tarefa (ação) que é executada. Um plug-in pode ter um ou mais objetivos.
Um ou mais objetivos precisam ser especificados ao configurar um plug-in em um POM . Além disso, caso um plug-in não tenha uma fase padrão definida, os objetivos especificados podem ser vinculados a uma fase.
O Maven pode ser chamado com:
clean
, package
)<plugin-prefix>:<goal>
(por exemplo dependency:copy-dependencies
)<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
(por exemplo org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)com uma ou mais combinações de uma ou de todas, por exemplo:
mvn clean dependency:copy-dependencies package
Build Phase
, penso nele como outra fase do ciclo de vida e isso me confunde.
Eu acredito que uma boa resposta já está prevista, mas eu gostaria de adicionar um diagrama de fácil acompanhamento dos diferentes 3 vida-ciclos ( build
, clean
e site
) e as fases em cada um.
As fases em negrito - são as principais fases comumente usadas.
generate-resources
aparece duas vezes e generate-sources
está ausente.
Crédito para Sandeep Jindal e Premraj. A explicação deles me ajuda a entender depois de confuso sobre isso por um tempo.
Criei alguns exemplos de código completo e algumas explicações simples aqui https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Eu acho que isso pode ajudar os outros a entender.
Resumindo, a partir do link, você não deve tentar entender todos os três de uma vez; primeiro, você deve entender o relacionamento nesses grupos:
1. Ciclo de Vida x Fase
Ciclo de vida é uma coleção de fases em sequência, veja aqui Referências do ciclo de vida . Quando você chama uma fase , ela também chama todas as fases anteriores a ela.
Por exemplo, o ciclo de vida limpo possui 3 fases ( pré-limpeza, limpeza e pós-limpeza ).
mvn clean
Ele chamará pré-limpo e limpo .
2. Plug-in vs objetivo
O objetivo é como uma ação no plug-in . Portanto, se o plug-in é uma classe, o objetivo é um método.
você pode chamar uma meta como esta:
mvn clean:clean
Isso significa "chame a meta limpa, no plug-in limpo" (nada aqui se refere à fase limpa. Não deixe a palavra "limpa" confundir você, eles não são os mesmos!)
3. Agora, a relação entre Fase e Objetivo:
A fase pode (pré) vincular à (s) meta (s). Por exemplo, normalmente, a fase limpa é vinculada à meta limpa. Então, quando você chama este comando:
mvn clean
Ele chamará a fase de pré-limpeza e a fase de limpeza que se vincula ao objetivo limpo: limpo.
É quase o mesmo que:
mvn pre-clean clean:clean
Mais detalhes e exemplos completos estão em https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/
Maven terminologia de trabalho com fases e objetivos.
Fase: a fase Maven é um conjunto de ações que está associado a 2 ou 3 objetivos.
exemplo: - se você executar o mvn clean
esta é a fase que irá executar o objetivo mvn clean: clean
Objetivo: objetivo do Maven limitado à fase
para referência http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
Existem três ciclos de vida de construção integrados a seguir:
Padrão do ciclo de vida -> [validar, inicializar, gerar fontes, fontes de processo, recursos de geração, recursos de processo, compilação, classes de processo, fontes de teste de geração, fontes de teste de processo, fontes de teste de processo, recursos de teste de geração, processo -test-resources, test-compile, process-test-classes, test, prepare-package, package, pré-integração-teste, integração-teste, pós-integração-teste, verificar, instalar, implantar]
Limpeza do ciclo de vida -> [pré-limpeza, limpeza e pós-limpeza]
Site do ciclo de vida -> [pré-site, site, pós-site, implantação do site]
O fluxo é seqüencial, por exemplo, para o ciclo de vida padrão , começa com validar e depois inicializa e assim por diante ...
Você pode verificar o ciclo de vida ativando o modo de depuração, mvn
ou seja,mvn -X <your_goal>