Quais são os objetivos e fases do Maven e qual a diferença deles?

Respostas:

251

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.

Ritmo
fonte
11
Eu criei o hábito de dizer "Maven passa todas as fases (até e incluindo o dado)" em vez de "executa" ou "executa" (o último, como é chamado na Introdução ao ciclo de vida de construção do Maven ). Isso o distingue mais claramente do código do objetivo que é realmente executado. Mas isso pode ser gosto pessoal.
GeroldBroser restabelece Monica
Mas também podemos executar objetivos que não pertencem a nenhuma fase, ou seja mvn archetype:generate, e nesse caso o maven apenas executa o objetivo?
Quazi Irfan
1
@Pace Você tem uma referência para o último parágrafo? Eu tenho duvidado disso e tentei com um projeto simples aqui: mvn testruns:, --- 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:testenquanto mvn compiler:testCompileapenas executa --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser restabelece Monica 03/02
4
O @Pace mvn clean compiler:testCompileé executado --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompilecom 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 MvnPhaseestá a classe em teste referenciada na classe de teste). Aparentemente, as fases não são invocadas se uma meta for invocada explicitamente.
GeroldBroser restabelece Monica 04/02
1
Com base nas informações de geroldbroser e @ kekko12, atualizei o último parágrafo para afirmar que, quando um objetivo é especificado, apenas esse objetivo é executado e nem todas as fases anteriores.
Pace
188

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 :

  1. padrão
  2. limpar \ limpo
  3. local

Cada ciclo de vida da compilação é composto de fases

Por exemplo, o defaultciclo 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'. mvnpode 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 testfase. Nesse caso, o Maven executa a resources:resourcesmeta associada à process-resourcesfase compiler:compilee assim sucessivamente até finalmente executar a surefire:testmeta.

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 cleane packagesã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 cleanfase será executada primeiro (o que significa que executará todas as fases anteriores do ciclo de vida limpo, mais a cleanprópria fase) e, em seguida, o dependency:copy-dependenciesobjetivo, 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:

insira a descrição da imagem aqui

Referência 1
Referência 2

Amostra Eclipse para Mapeamento do Ciclo de Vida do Maven

Amostra Eclipse para Mapeamento do Ciclo de Vida do Maven

Premraj
fonte
Se eu tiver 2 perfis, posso executar todos os plugins do perfil 1 primeiro e depois o do perfil 2?
Bee
[plugin-name]no exemplo mvn [plugin-name]:[goal-name]é um prefixo de plug - in . mvn clean installnão pode apenas " ser usado em um cenário de vários módulos ". O multi-módulo é um tópico totalmente diferente.
GeroldBroser restabelece Monica 03/02
Os objetivos associados à mesma fase cumprem alguma ordem?
enguia ghEEz
5
A maior parte deste texto é copiada literalmente da documentação do Maven . Isto deve ser claramente indicado!
Lii
fonte incrível!
Bobo
45

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:

  • É uma fase que executa o plugin do compilador com objetivo de compilação
  • O plugin do compilador tem objetivos diferentes. Pois mvn compileé mapeado para uma meta específica, a meta de compilação.
  • É o mesmo que correr mvn compiler:compile

Portanto, a fase é composta de objetivos do plug-in .

insira a descrição da imagem aqui

Link para a referência

Johnny
fonte
20
por que está mvn testapontando packagee mvn installapontando deploy?
Abdull
2
Parece um erro de ilustração, obrigado por notá-lo (encontrado na web).
11119 Johnny
3
De onde você tirou a ilustração? Você verificou os direitos autorais e os termos de uso?
Abdull
1
Imagem do @Abdull tirada aqui carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (e também aparece em muitas outras páginas da web) adicionando-a à resposta. Obrigado por levantar este ponto, não estava ciente da importância dele.
Johnny
1
Os indicadores de fases para plug-ins no diagrama também não estão certos, o jarplug - in é executado na packagefase. 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.
Alexander Klimetschek
43

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:

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

  2. Estágio

    Cada ciclo de vida é composta por fases de , por exemplo, para o defaultciclo de vida: compile, test, package, install, etc.

  3. Plugar

    Um artefato que fornece um ou mais objetivos.

    Com base no tipo de embalagem ( jar, waretc.), os objetivos dos plug-ins estão vinculados às fases por padrão. ( Ligações do ciclo de vida incorporadas )

  4. 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:

  1. uma fase (por exemplo clean, package)
  2. <plugin-prefix>:<goal>(por exemplo dependency:copy-dependencies)
  3. <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
Sandeep Jindal
fonte
Somente as fases do ciclo de vida fazem realmente sentido serem consideradas como "etapas" (de um processo de construção). Prefiro chamá-lo de 4 entidades / itens / coisas .
GeroldBroser restabelece Monica
Quando vejo o mundo Build Phase, penso nele como outra fase do ciclo de vida e isso me confunde.
Quazi Irfan 3/06
26

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, cleane site) e as fases em cada um.

insira a descrição da imagem aqui

As fases em negrito - são as principais fases comumente usadas.

Lior Bar-On
fonte
2
generate-resourcesaparece duas vezes e generate-sourcesestá ausente.
Elingerojo 6/03/19
12

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:

  • Ciclo de vida x fase
  • Objetivo vs Plug-in

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/

Surasin Tancharoen
fonte
2

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

Venky Vungarala
fonte
4
Não precisa ser "associado a 2 ou 3 objetivos" necessariamente. Pode ser nenhum , um ou mais de três também.
GeroldBroser restabelece Monica
1

Existem três ciclos de vida de construção integrados a seguir:

  • padrão
  • limpar \ limpo
  • local

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, mvnou seja,mvn -X <your_goal>

Vishrant
fonte