Maven: ciclo di vita, fase, plug-in e obiettivo [chiuso]


106

Sviluppatore relativamente nuovo qui, anche se lo uso da un po 'di tempo, spero di consolidare i miei fondamenti di Maven. Parte del mio problema è che non ho alcuna esperienza con Ant, che sembra essere, da dove nascono molte spiegazioni. Ho letto e guardato tutorial e continuo a sentire gli stessi termini:

  • Ciclo vitale
  • Fase
  • Collegare
  • Obbiettivo

Da quello che ho imparato, sembra che il ciclo di vita sia il più ampio del gruppo ed è composto da (o completato da) fasi, plugin e / o obiettivi.

Domanda : potresti fornire informazioni su come questi termini sono correlati e sugli esempi più comuni?

Più è esplicito ed essenziale, meglio è!



Grazie @Drejc - non posso credere di non averlo trovato nella mia ricerca. Lo leggerò ora.
Jeff Levine

2
Quindi, per chiarire, build lifecycle = lifecycle , di cui esistono tre tipi: predefinito, pulito e sito? Altre spiegazioni mi hanno fatto pensare che ci fosse un quarto ciclo di vita chiamato build .
Jeff Levine


3
Troppo ampio? Ciò riguarda le basi fondamentali di Maven e ha alcune risposte valide e dettagliate. I moderatori senza un singolo tag Maven non dovrebbero essere autorizzati a decidere questo.
Gerold Broser

Risposte:


73

Un ciclo di vita Maven è un concetto (astratto) che copre tutti i passaggi (o meglio: tutti i passaggi che i progettisti Maven hanno deciso di supportare) che dovrebbero verificarsi durante la vita di sviluppo di un progetto. Questi passaggi (o stadi) sono chiamati fasi nella terminologia Maven.

Un plugin Maven è un contenitore per / fornitore di obiettivi. Il codice implementato negli obiettivi è il vero cavallo di battaglia. ( Maven nel suo nucleo stesso sta solo gestendo i plugin e eseguendo gli obiettivi ). Ciascuno degli obiettivi di un plug-in può essere assegnato / associato a qualsiasi fase del ciclo di vita.

Quando si richiama mvn <phase> Maven passa tutte le fasi (ogni volta) ed esegue tutti gli obiettivi (forniti dai plugin) che sono stati associati a una qualsiasi delle fasi precedenti e fino a (e inclusa) la fase data. Se c'è una fase a cui non è legato alcun obiettivo, non viene fatto nulla. Ma la fase è comunque passata.

Cioè non è possibile "inserire" fasi aggiuntive " in uno dei cicli di vita incorporati di Maven. Sono già lì, sempre! Potresti sviluppare il tuo ciclo di vita con le sue fasi, ma va ben oltre il semplice utilizzo di Maven così com'è.

Gli obiettivi possono anche essere eseguiti direttamente, che ti viene detto quando corri mvnsenza alcuna fase o obiettivo [con interruzioni di riga e abbreviato per leggibilità qui]:

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

Riferimenti:

Se ti sei mai chiesto come fa Maven a sapere cosa fare senza alcun vincolo di obiettivo nel POM, c'è un collegamento alla default-bindings.xmlfine che si trova in <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

Le fasi per i cicli di vita incorporati ( clean , default , site ) sono dichiarate in <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlunder .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.


41

Maven: ciclo di vita, fase, plug-in e obiettivo

Rispondere in ritardo solo per chiarire un altro livello di granularità mancante in questo thread: le esecuzioni (di un obiettivo), che sono le unità più piccole di una build di Maven.

Quindi, abbiamo cicli di compilazione (fondamentalmente, un insieme di azioni per uno specifico obiettivo generale), che consistono in fasi (granularità inferiore, una fase del ciclo), che possono richiamare un insieme di obiettivi configurati forniti da determinati plugin . Cioè, Maven è (anche) un esecutore di plugin, ogni plugin può offrire uno o più obiettivi. Quindi (anche) decidi quale obiettivo è associato a quale fase, il più delle volte nel ciclo di vita predefinito (senza alcuno, cioè l'impostazione predefinita). Ma in realtà puoi avere ancora un altro livello: le esecuzioni (dello stesso obiettivo, dallo stesso plug-in o di obiettivi diversi da plug-in diversi)

Una foto che ho preparato per riprendere il tutto inserisci qui la descrizione dell'immagine

E in effetti è così che Maven lo mostra (la sua più piccola unità di lavoro) tramite la stringa univoca nel suo registro di build:

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

Ad esempio, avremmo:

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

Che in effetti significa (attraverso diversi livelli di granularità):

  • durante la compilefase (non menzionata, purtroppo)>
  • Sto invocando il plug-in Maven Compiler ( artifactIde version)>
  • Sto invocando il suo compileobiettivo>
  • come definito default-compiledall'esecuzione

È unico perché infatti potresti avere lo stesso obiettivo (dello stesso plugin) legato a fasi differenti o alla stessa fase ma in esecuzioni differenti (cioè con configurazioni differenti). Il maven-compiler-plugin, per esempio, viene utilizzato anche durante la test-compilefase (una fase diversa) per compilare il codice di test (tramite il suo testCompileobiettivo) in una diversa esecuzione ( default-testCompile). Puoi anche compilare (usando lo stesso plugin e lo stesso obiettivo) del codice generato automaticamente durante una fase diversa, come definito da un'esecuzione che hai specificato nel POM (e potenzialmente una configurazione diversa).

Le esecuzioni predefinite sono fornite out-of-the-box tramite i binding di pacchettizzazione di Maven , ovvero, per impostazione predefinita (e applicando la convenzione alla configurazione) Maven invoca già determinati obiettivi (dei plugin standard) durante determinate fasi. Gli ID di esecuzione di queste chiamate predefinite sono definiti in base a determinate convenzioni .

Questo spiega anche perché se vuoi davvero sovrascrivere un comportamento predefinito (binding) di una build Maven, devi specificare (sovrascrivere) esattamente lo stesso ID di esecuzione nel tuo POM per lo stesso plugin. Si potrebbe, ad esempio, saltare la compilazione definendo semplicemente un'esecuzione del maven-compiler-plugincon lo stesso default-compileid ma vincolata ad una fase inesistente (o vuota).

Per farla breve : un'esecuzione dice a Maven quali obiettivi eseguire con quale configurazione all'interno di quale fase.

Alcune esecuzioni sono fornite di default (binding predefiniti), il che spiega perché il pom minimal maven di sole 6 righe può già fare molto (compilazione, test, pacchetto, ecc.): Eseguire gli obiettivi dei plugin standard in determinate fasi: è una convenzione finita configurazione. Quindi, tramite la pom.xmlconfigurazione è possibile aggiungere cose (esecuzioni) alla build o influenzare il comportamento dei plugin già configurati (in questo caso nessuna executionssezione, ma configurationsarebbe sufficiente).

Sì, puoi saltare i cicli di compilazione (e le loro fasi) e invocare direttamente gli obiettivi (dei plugin). Immagina quanto segue:

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

(NOTA: puoi anche richiamare inline in una sola chiamata)

Qui stiamo compilando il codice dell'app, il codice di test, eseguiamo i test e il pacchetto: immagina quanto sarebbe manuale, soggetto a errori, ripetitivo e dispendioso in termini di tempo. La convenzione sulla configurazione ci aiuta: Maven introduce fasi e cicli di vita della build . Il ciclo di vita predefinito (senza nome, ovvero l'impostazione predefinita), fornisce una serie di fasi basate su best practice e convenzioni (il mantra di Maven).
Se vuoi ottenere lo stesso risultato di cui sopra, esegui semplicemente: mvn packagee automaticamente compilerà, testerà e impacchetterà il tuo progetto. Come? invocando plugin. Cioè, le fasi sono un insieme significativo e configurabile di esecuzioni di plugin (obiettivi). Per renderlo ancora più standard, per ogni fase Maven richiamerà prima qualsiasi fase precedente, in modo che, ad esempio, se vuoi testare sarai sicuro di compilare prima.

ps si noti che quando si specificano diversi obiettivi per lo stesso execution, si vedranno ancora chiaramente nel registro di compilazione due diverse esecuzioni (con lo stesso id) per i due diversi obiettivi (quindi, tupla ancora unica).


18

Ringraziamo Sandeep Jindal e Premraj (da qui quali sono gli obiettivi e le fasi di Maven e qual è la loro differenza? ). La loro spiegazione mi aiuta a capire.

Ho creato alcuni esempi di codice completi e alcune semplici spiegazioni qui https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Penso che possa aiutare gli altri a capire e possono provare qualcosa direttamente.

In breve dal collegamento, non dovresti cercare di capirli tutti e tre contemporaneamente, prima dovresti capire la relazione in questi gruppi:

  • Ciclo di vita vs fase
  • Plugin vs obiettivo

1. Ciclo di vita vs fase

Life Cycle è una raccolta di fasi in sequenza, vedere qui Riferimenti sul ciclo di vita . Quando chiami una fase , chiamerà anche tutte le fasi precedenti.

Ad esempio, il ciclo di vita pulito ha 3 fasi ( pre-pulizia, pulizia, post-pulizia ).

mvn clean

Chiamerà pre-pulizia e pulizia .

2. Plugin vs obiettivo

L'obiettivo è come un'azione in Plugin . Quindi, se il plugin è una classe, l'obiettivo è un metodo.

puoi chiamare un obiettivo come questo:

mvn clean:clean

Ciò significa "chiama l'obiettivo pulito, nel plug-in pulito" (Niente si riferisce alla fase pulita qui. Non lasciare che la parola "pulito" ti confonda, non sono la stessa cosa! Vedi la spiegazione completa nel mio link sopra)

3. Ora la relazione tra Fase e Obiettivo:

La fase può (pre) collegamenti agli obiettivi . Ad esempio, normalmente, la fase pulita si collega all'obiettivo pulito. Quindi, quando chiami questo comando:

mvn clean

Chiamerà la fase di pre-pulizia e la fase di pulizia che si collega all'obiettivo pulito: pulito.

È quasi uguale a:

mvn pre-clean clean:clean

1
@ 2. e 3. IMHO, clean:cleannon è la scelta migliore per un esempio. Ci sono 4 elementi denominati clean(ciclo di vita, fase, plug-in, obiettivo) che possono creare confusione, soprattutto per i principianti (ricordo che era per me all'inizio). @ 3. Anche il verbo "link" non è una buona scelta, IMHO. Il termine ufficiale di Maven è " legare ".
Gerold Broser

@GeroldBroser. Completamente d'accordo con clean: clean. L'avevo spiegato e avvertito nella mia spiegazione completa nel link. Copierò anche questi avvertimenti qui. Il motivo per cui l'ho usato perché è bene far sapere alla gente di questa parola confusa e, soprattutto, il documento ufficiale di Maven lo sta usando e questo lo spiega chiaramente. E sì, anche me stava confondendo. Comunque, grazie mille per i commenti
Surasin Tancharoen

errore di battitura: il documento ufficiale di Maven lo sta usando e non lo spiega chiaramente
Surasin Tancharoen

17

E in ritardo un altro diagramma

  • Cicli di vita come rettangoli gialli
  • Fasi dei cicli di vita come rettangoli blu con fasi "richiamabili" in blu più scuro (cioè le fasi con ipenazione non vengono solitamente chiamate dalla riga di comando in quanto potrebbero non essere progettate per lasciare il progetto in uno stato ben definito).
  • Obiettivi come losanghe blu. La "fase -> obiettivo" di associazione / associazione mostrata è quella della modalità di confezionamento "jar" . Ogni fase può avere obiettivi vincolati ad essa. Ciò vale ovviamente per ciascuno dei cicli di vita, sebbene i collegamenti vengano visualizzati solo per il ciclo di vita "predefinito".
  • Plugin come rettangoli grigi ritagliati. I plugin forniscono gli obiettivi che possono essere associati alle fasi.

Cicli di vita, fasi, obiettivi, plug-in di Maven


Il file graphml (modificato con l'editor gratuito yEd) è disponibile su github.com/dtonhofer/diagrams
David Tonhofer

1) Cosa intendi esattamente per "fasi " richiamabili " " che sono " in blu scuro "? Ogni fase di Maven è "richiamabile" (anche se io la chiamo invocabile , dato che non c'è codice chiamato direttamente invocando una fase). O chiamate le fasi " richiamabili " che hanno un obiettivo vincolato (per impostazione predefinita)? Nemmeno questo è vero, se guardi validate, initializee verify.
Gerold Broser

2) L' resources:[testR|r]esourcesobiettivo NON è vincolato alle fasi process-sourceso process-test-sourcesdel jarciclo di vita .
Gerold Broser

3) modello:javadel Modello Plugin apparentemente è specifico del dominio. L'associazione dell'obiettivo di un plugin a una fase vale per qualsiasi fase.
Gerold Broser

@GeroldBroser Risolto in base ai commenti. "Richiamabile" significa che è possibile richiamarlo dalla riga di comando e aspettarsi che il progetto rimanga in uno stato valido. Non esiste una distinzione significativa tra chiamare e invocare e chiamare è ciò che utilizza l' introduzione di Maven .
David Tonhofer

12

Fonte questo è davvero un buon tutorial

I cicli di vita, le fasi del ciclo di vita, i plug-in e gli obiettivi dei plug-in sono il fulcro di Maven.

  • Il comando Maven mvn può accettare solo Lifecycle Phase o Plugin Goal come argomento.
  • Maven viene fornito con tre cicli di vita: predefinito, pulito e sito.
  • Ogni ciclo di vita è composto da fasi del ciclo di vita e in tutto ci sono 28 fasi: predefinito 21 ( convalida, ..., compilazione, ..., pacchetto, ..., installazione, distribuzione ), pulizia 3 ( pre-pulizia, clean, post-clean ) e il sito 4 ( pre-site, site, post-site, site-deploy ).
  • quando una fase del ciclo di vita viene richiamata utilizzando il comando mvn, tutte le fasi precedenti vengono eseguite in sequenza una dopo l'altra.
  • le fasi del ciclo di vita da sole non hanno alcuna capacità per svolgere alcune attività e si affidano a plugin per svolgere l'attività.
  • a seconda del progetto e del tipo di packaging, Maven lega vari obiettivi del plugin alle fasi del ciclo di vita e gli obiettivi eseguono il compito loro affidato.

Quando eseguiamo " pacchetto mvn " in un progetto Java, Maven associa gli obiettivi del plug-in alle fasi del ciclo di vita come mostrato nella figura successiva.

MVN-plugins-package-obiettivo


1
Il materiale che hai citato è piuttosto buono. Grazie!
William Kinaan

@ " Il comando Maven mvn può accettare solo la fase del ciclo di vita o l'obiettivo del plug-in come argomento. " Non è corretto. Accetta anche opzioni .
Gerold Broser

" Quando eseguiamo" pacchetto mvn "in un progetto Java, Maven associa gli obiettivi del plugin alle fasi del ciclo di vita " non è vero. Il binding degli obiettivi avviene molto prima dell'esecuzione mvn ...: in default-bindings.xml o in un POM e non viene eseguito da Maven ma da un essere umano.
Gerold Broser

7

Quindi, per spiegare un po 'di più come delineato qui

Le build di Maven sono suddivise in cicli di vita che sono:

  • pulito
  • build (predefinito)
  • posto

Ciascuno di questi cicli è suddiviso in fasi. Ad esempio, la build è suddivisa in fasi come:

  • preparare le risorse
  • compilare
  • pacchetto
  • installare

Fasi hanno obiettivi da eseguire prima pre o dopo post- fase di una, per esempio:

  • pre-clean: verrà eseguito prima della fase di pulizia
  • post-clean: verrà eseguito dopo la fase di clean

Se lo desideri, puoi visualizzare gli obiettivi come fasi "inserite" aggiuntive. Leggi qui o dai un'occhiata alla risposta di @Gerolds per i dettagli.


1
Questa risposta non è corretta nella sua interezza. Vedi la mia risposta .
Gerold Broser

O ragazzo 3 anni da quando hai risposto a questa domanda ... e ancora non la lasci andare .. hai vinto ... ora vai avanti.
Drejc

Non si tratta di vincere. Non rivedi vecchie domande, risposte e commenti se ti imbatti in un secondo momento?
Gerold Broser

3

LifeCycle vs Phases: Life Cycle è una raccolta di file phases. Quando chiami una fase, chiamerà anche tutte le fasi che la precedono. Maven viene fornito con 3 cicli di vita incorporati come:

  1. Ciclo di vita pulito: implica la pulizia del progetto (per una nuova build e distribuzione)
  2. Default / build lifecycle: gestisce la distribuzione completa del progetto
  3. Ciclo di vita del sito: gestisce la generazione della documentazione java del progetto. inserisci qui la descrizione dell'immagine

Il ciclo di vita pulito ha 3 fasi: pre-pulizia, pulizia e post-pulizia. Le fasi dei cicli di vita predefiniti e del sito sono le stesse mostrate nell'immagine.


Il tuo ultimo paragrafo è fuorviante. Soprattutto la prima e l'ultima frase. Obiettivi e fasi sono cose completamente diverse. Non devi confonderli perché alcuni di loro hanno nomi identici. Re "Gli obiettivi sono le fasi che vedi nella foto sopra. ": Non c'è un solo obiettivo menzionato nella foto. Queste sono tutte fasi . Re " Scrivi il nome della fase come 'obiettivo' quando devi eseguire un determinato obiettivo. ": Sebbene sia possibile eseguire l'obiettivo di un plug-in in modo esplicito, il modo usuale è eseguire un build fino a una certa fase con mvn <phase>. Vedi la mia risposta qui.
Gerold Broser

Grazie, ho rimosso la parte "Plugin vs Goal". Lo aggiornerò presto.
Arun Raaj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.