Qual è la differenza / relazione tra obiettivi e fasi di Maven? In che modo sono collegati tra loro?
Qual è la differenza / relazione tra obiettivi e fasi di Maven? In che modo sono collegati tra loro?
Risposte:
Gli obiettivi vengono eseguiti in fasi che aiutano a determinare l'ordine in cui vengono eseguiti gli obiettivi. La migliore comprensione di ciò è esaminare i vincoli del ciclo di vita Maven predefiniti che mostrano quali obiettivi vengono eseguiti in quali fasi per impostazione predefinita. Gli obiettivi della fase di compilazione verranno sempre eseguiti prima degli obiettivi della fase di test che verranno sempre eseguiti prima degli obiettivi della fase del pacchetto e così via.
Parte della confusione è esacerbata dal fatto che quando si esegue Maven è possibile specificare un obiettivo o una fase. Se specifichi una fase, maven eseguirà tutte le fasi fino alla fase specificata nell'ordine (ad es. Se specifichi un pacchetto, eseguirà prima la fase di compilazione e poi la fase di test e infine la fase del pacchetto) e per ogni fase eseguire tutti gli obiettivi collegati a quella fase.
Quando crei un'esecuzione di plugin nel tuo file di build Maven e specifichi solo l'obiettivo, questo vincolerà tale obiettivo a una determinata fase predefinita. Ad esempio, l'obiettivo jaxb: xjc si lega per impostazione predefinita alla fase di generazione delle risorse. Tuttavia, quando specifichi l'esecuzione puoi anche specificare esplicitamente la fase per quell'obiettivo.
Se si specifica un obiettivo quando si esegue Maven, verrà eseguito quell'obiettivo e solo quell'obiettivo. In altre parole, se specifichi l'obiettivo jar: jar eseguirà solo l'obiettivo jar: jar per impacchettare il codice in un vaso. Se in precedenza non è stato eseguito l'obiettivo di compilazione o non è stato preparato il codice compilato in un altro modo, molto probabilmente ciò potrebbe non riuscire.
mvn archetype:generate
, e in quel caso Maven esegue solo l'obiettivo?
mvn test
corre:, --- 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
mentre mvn compiler:testCompile
corre --- maven-compiler-plugin:3.1:testCompile ...
.
mvn clean compiler:testCompile
Esegue @Pace --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
che non riesce 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
(dov'è MvnPhase
la classe sotto test a cui fa riferimento la classe test). Apparentemente le fasi non vengono invocate se un obiettivo viene invocato esplicitamente.
Il ciclo di vita è una sequenza di fasi denominate .
Le fasi vengono eseguite in sequenza. Eseguire una fase significa eseguire tutte le fasi precedenti.Il plug-in è una raccolta di obiettivi chiamata anche MOJO ( M aven O ld J ava O bject).
Analogia: il plugin è una classe e gli obiettivi sono metodi all'interno della classe.
Maven si basa sul concetto centrale di Build Life Cycles . All'interno di ogni ciclo di vita delle build ci sono fasi di costruzione e all'interno di ciascuna fase di costruzione ci sono obiettivi di costruzione .
Possiamo eseguire una fase di costruzione o un obiettivo di costruzione. Quando eseguiamo una fase di costruzione eseguiamo tutti gli obiettivi di costruzione all'interno di quella fase di costruzione. Gli obiettivi di costruzione sono assegnati a una o più fasi di costruzione. Possiamo anche eseguire direttamente un obiettivo di costruzione.
Esistono tre principali cicli di vita integrati :
Ogni ciclo di vita della build è composto da fasi
Ad esempio, il default
ciclo di vita comprende le seguenti fasi di costruzione :
◾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.
Quindi per passare attraverso le fasi sopra, dobbiamo solo chiamare un comando:
mvn <phase> { Ex: mvn install }
Per il comando sopra, a partire dalla prima fase, tutte le fasi vengono eseguite in sequenza fino alla fase di "installazione". mvn
può eseguire un obiettivo o una fase (o anche più obiettivi o più fasi) come segue:
mvn clean install plugin:goal
Tuttavia, se si desidera personalizzare il prefisso utilizzato per fare riferimento al proprio plug-in, è possibile specificare il prefisso direttamente tramite un parametro di configurazione maven-plugin-plugin
nella POM del plug-in.
Una fase di costruzione è costituita da obiettivi del plug-in
La maggior parte delle funzionalità di Maven è nei plugin. Un plugin fornisce una serie di obiettivi che possono essere eseguiti utilizzando la sintassi seguente:
mvn [plugin-name]:[goal-name]
Ad esempio, un progetto Java può essere compilato con l'obiettivo di compilazione del plug-in del compilatore eseguendo mvn compiler:compile
.
Costruisci ciclo di vita è un elenco di fasi denominate che possono essere utilizzate per dare ordine all'esecuzione degli obiettivi.
Gli obiettivi forniti dai plug-in possono essere associati a diverse fasi del ciclo di vita. Ad esempio, per impostazione predefinita, l' obiettivo compiler:compile
è associato alla compile
fase , mentre l' obiettivo surefire:test
è associato alla test
fase . Considera il seguente comando:
mvn test
Quando viene eseguito il comando precedente, Maven esegue tutti gli obiettivi associati a ciascuna delle fasi fino alla test
fase inclusa . In tal caso, Maven esegue l' resources:resources
obiettivo associato alla process-resources
fase, quindi compiler:compile
, e così via fino a quando non raggiunge l' surefire:test
obiettivo.
Tuttavia, anche se una fase di compilazione è responsabile di una fase specifica del ciclo di vita della compilazione, il modo in cui svolge tali responsabilità può variare. E questo viene fatto dichiarando gli obiettivi del plugin legati a quelle fasi di costruzione.
Un obiettivo plugin rappresenta un'attività specifica (più fine di una fase di costruzione) che contribuisce alla costruzione e alla gestione di un progetto. Potrebbe essere associato a zero o più fasi di costruzione. Un obiettivo non associato a nessuna fase di compilazione potrebbe essere eseguito al di fuori del ciclo di vita della compilazione mediante invocazione diretta. L'ordine di esecuzione dipende dall'ordine in cui vengono invocati gli obiettivi e le fasi di costruzione. Ad esempio, considera il comando seguente. Gli argomenti clean
e package
sono fasi di costruzione, mentre dependency:copy-dependencies
è un obiettivo (di un plug-in).
mvn clean dependency:copy-dependencies package
Se questo dovesse essere eseguito, la clean
fase verrà eseguita prima (nel senso che eseguirà tutte le fasi precedenti del ciclo di vita pulito, più la clean
fase stessa), e poi l' dependency:copy-dependencies
obiettivo, prima di eseguire finalmente la package
fase (e tutte le precedenti fasi di costruzione di il ciclo di vita predefinito).
Inoltre, se un obiettivo è legato a una o più fasi di costruzione, quell'obiettivo verrà chiamato in tutte quelle fasi.
Inoltre, una fase di costruzione può anche avere zero o più goal ad essa associati. Se una fase di costruzione non ha obiettivi associati, quella fase di costruzione non verrà eseguita. Ma se ha uno o più obiettivi ad esso associati, eseguirà tutti quegli obiettivi.
Associazioni integrate nel ciclo di vita
Alcune fasi hanno obiettivi associati ad esse per impostazione predefinita. E per il ciclo di vita predefinito, questi collegamenti dipendono dal valore dell'imballaggio.
Maven Architecture:
Esempio Eclipse per la mappatura del ciclo di vita di Maven
[plugin-name]
nell'esempio mvn [plugin-name]:[goal-name]
è piuttosto un prefisso del plugin . mvn clean install
non può solo " essere utilizzato in uno scenario multi-modulo ". Il multi-modulo è un argomento totalmente diverso.
La risposta scelta è ottima, ma vorrei aggiungere qualcosa di piccolo all'argomento. Un'illustrazione.
Dimostra chiaramente come le diverse fasi si sono legate a diversi plugin e gli obiettivi che tali plugin espongono.
Quindi, esaminiamo un caso di esecuzione di qualcosa di simile mvn compile
:
mvn compile
è associato a un obiettivo specifico, l'obiettivo di compilazione.mvn compiler:compile
Pertanto, la fase è composta da obiettivi del plug-in .
Link al riferimento
mvn test
puntando package
e mvn install
puntando deploy
?
jar
plug-in viene effettivamente eseguito nella package
fase. E il pom nel sandwich tra fasi e plugin è un po 'confuso (suppongo che dovrebbe significare che nel pom puoi configurare quali plugin funzionano in quali fasi, oltre ai collegamenti predefiniti). Il principio generale è giusto, però.
Le definizioni sono dettagliate nella pagina del sito Maven Introduzione al ciclo di vita della build , ma ho cercato di riassumere :
Maven definisce 4 elementi di un processo di compilazione:
Ciclo vitale
Tre built-in cicli di vita (aka cicli di vita di build ): default
, clean
, site
. ( Riferimenti sul ciclo di vita )
Fase
Ogni ciclo di vita si compone di fasi , ad esempio per il default
ciclo di vita: compile
, test
, package
, install
, etc.
Collegare
Un artefatto che fornisce uno o più obiettivi.
In base al tipo di imballaggio ( jar
, war
, ecc) gli obiettivi plugin sono legati alle fasi di default. ( Attacchi per il ciclo di vita integrati )
Obbiettivo
L'attività (azione) che viene eseguita. Un plugin può avere uno o più obiettivi.
È necessario specificare uno o più obiettivi quando si configura un plug-in in un POM . Inoltre, nel caso in cui un plug-in non abbia una fase predefinita definita, gli obiettivi specificati possono essere associati a una fase.
Maven può essere invocato con:
clean
. package
)<plugin-prefix>:<goal>
(ad es. dependency:copy-dependencies
)<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
(ad es. org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)con una o più combinazioni di uno o tutti, ad esempio:
mvn clean dependency:copy-dependencies package
Build Phase
, lo considero un'altra fase di un ciclo di vita e mi confonde.
Ritengo una buona risposta è già disponibile, ma desidero aggiungere un diagramma facile da seguire dei vari 3 cicli di vita ( build
, clean
e site
) e le fasi in ciascuna.
Le fasi in grassetto - sono le fasi principali comunemente utilizzate.
generate-resources
appare due volte e generate-sources
manca.
Ringraziamo Sandeep Jindal e Premraj. La loro spiegazione mi aiuta a capire dopo un po 'di confusione al riguardo.
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.
In breve dal link, non dovresti provare a capire tutti e tre contemporaneamente, prima dovresti capire la relazione in questi gruppi:
1. Ciclo di vita vs fase
Il ciclo di vita è una raccolta di fasi in sequenza vedi qui Riferimenti del ciclo di vita . Quando chiamate una fase , chiamerà anche tutte le fasi prima di essa.
Ad esempio, il ciclo di vita pulito ha 3 fasi ( pre-pulizia, pulizia, post-pulizia ).
mvn clean
Chiamerà pre-clean e clean .
2. Plugin vs Obiettivo
L'obiettivo è come un'azione nel plugin . Quindi se il plugin è una classe, l'obiettivo è un metodo.
puoi chiamare un obiettivo come questo:
mvn clean:clean
Questo significa "chiama l'obiettivo pulito, nel plugin pulito" (Nulla si riferisce alla fase pulita qui. Non lasciare che la parola "pulito" ti confonda, non sono gli stessi!)
3. Ora la relazione tra Fase e Obiettivo:
La fase può (pre) collegarsi agli Obiettivi . Ad esempio, normalmente, la fase pulita si collega all'obiettivo pulito. Quindi, quando si chiama questo comando:
mvn clean
Chiamerà la fase di pre-pulizia e la fase di pulizia che si collega all'obiettivo clean: clean.
È quasi lo stesso di:
mvn pre-clean clean:clean
Maggiori dettagli ed esempi completi sono disponibili in https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/
Terminologia di lavoro di Maven con fasi e obiettivi.
Fase: la fase di Maven è un insieme di azioni associato a 2 o 3 obiettivi
exmaple: - se si esegue mvn clean
questa è la fase che eseguirà l'obiettivo mvn clean: clean
Obiettivo: obiettivo Maven limitato alla fase
per riferimento http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
Esistono tre cicli di vita incorporati seguenti:
Ciclo di vita predefinito -> [convalida, inizializza, genera-fonti, processo-fonti, genera-risorse, risorse di processo, compilazione, classi di processo, genera-test-fonti, processo-fonti-test, genera-risorse-test, processo -test-risorse, test-compilazione, processo-test-classi, test, preparazione-pacchetto, pacchetto, test pre-integrazione, test di integrazione, test post-integrazione, verifica, installazione, distribuzione]
Ciclo di vita pulito -> [pre-pulito, pulito, post-pulito]
Ciclo di vita del sito -> [pre-site, site, post-site, site-deploy]
Il flusso è sequenziale, ad esempio, per il ciclo di vita predefinito , inizia con convalida , quindi inizializza e così via ...
Puoi controllare il ciclo di vita abilitando la modalità debug di mvn
ie,mvn -X <your_goal>