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
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
compile
fase (non menzionata, purtroppo)>
- Sto invocando il plug-in Maven Compiler (
artifactId
e version
)>
- Sto invocando il suo
compile
obiettivo>
- come definito
default-compile
dall'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-compile
fase (una fase diversa) per compilare il codice di test (tramite il suo testCompile
obiettivo) 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-plugin
con lo stesso default-compile
id 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.xml
configurazione è possibile aggiungere cose (esecuzioni) alla build o influenzare il comportamento dei plugin già configurati (in questo caso nessuna executions
sezione, ma configuration
sarebbe 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 package
e 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).