Quali sono gli obiettivi e le fasi di Maven e qual è la loro differenza?


Risposte:


251

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.


11
Ho preso l'abitudine di dire "Maven passa tutte le fasi (fino al dato incluso)" invece di "corre" o "esegue" (quest'ultima come viene chiamata nell'Introduzione al ciclo di vita di Maven ). Tale distinzione lo rende più chiaro dal codice dell'obiettivo che viene realmente eseguito. Ma potrebbe essere un gusto personale.
GeroldBroser ripristina Monica il

Ma possiamo anche raggiungere obiettivi che non appartengono a nessuna fase, vale a dire mvn archetype:generate, e in quel caso Maven esegue solo l'obiettivo?
Quazi Irfan,

1
@Pace Hai un riferimento per l'ultimo paragrafo? Ne dubito e l'ho provato con un semplice progetto qui: mvn testcorre:, --- 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:testmentre mvn compiler:testCompilecorre --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser ripristina Monica

4
mvn clean compiler:testCompileEsegue @Pace --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompileche 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'è MvnPhasela classe sotto test a cui fa riferimento la classe test). Apparentemente le fasi non vengono invocate se un obiettivo viene invocato esplicitamente.
GeroldBroser ripristina Monica il

1
Sulla base dell'input di geroldbroser e @ kekko12 ho aggiornato l'ultimo paragrafo per affermare che, quando viene specificato un obiettivo, viene eseguito solo quell'obiettivo e non tutte le fasi precedenti.
Pace

188

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 :

  1. predefinito
  2. pulito
  3. posto

Ogni ciclo di vita della build è composto da fasi

Ad esempio, il defaultciclo 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". mvnpuò 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-pluginnella 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 testfase inclusa . In tal caso, Maven esegue l' resources:resourcesobiettivo associato alla process-resourcesfase, quindi compiler:compile, e così via fino a quando non raggiunge l' surefire:testobiettivo.

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 cleane packagesono 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 cleanfase verrà eseguita prima (nel senso che eseguirà tutte le fasi precedenti del ciclo di vita pulito, più la cleanfase stessa), e poi l' dependency:copy-dependenciesobiettivo, prima di eseguire finalmente la packagefase (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:

inserisci qui la descrizione dell'immagine

Riferimento 1
Riferimento 2

Esempio Eclipse per la mappatura del ciclo di vita di Maven

Esempio Eclipse per la mappatura del ciclo di vita di Maven


Se ho 2 profili, posso prima eseguire tutti i plugin del profilo 1 e poi quello del profilo 2?
Ape,

[plugin-name]nell'esempio mvn [plugin-name]:[goal-name]è piuttosto un prefisso del plugin . mvn clean installnon può solo " essere utilizzato in uno scenario multi-modulo ". Il multi-modulo è un argomento totalmente diverso.
GeroldBroser ripristina Monica il

Gli obiettivi collegati alla stessa fase rispettano qualsiasi ordine?
Eel GhEEz

5
Gran parte di questo testo è copiato alla lettera dalla documentazione di Maven . Questo dovrebbe essere chiaramente indicato!
Lii

fonte fantastica!
Bobo,

45

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:

  • È una fase che esegue il plug-in del compilatore con obiettivo di compilazione
  • Il plug-in del compilatore ha obiettivi diversi. Perché mvn compileè associato a un obiettivo specifico, l'obiettivo di compilazione.
  • È come correre mvn compiler:compile

Pertanto, la fase è composta da obiettivi del plug-in .

inserisci qui la descrizione dell'immagine

Link al riferimento


20
perché sta mvn testpuntando packagee mvn installpuntando deploy?
Abdull,

2
Sembra un errore di illustrazione, grazie per averlo notato (fondato nel web).
Johnny,

3
Da dove hai preso l'illustrazione? Hai controllato i termini di copyright e di utilizzo?
Abdull,

1
@Abdull immagine presa da qui carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (ed è presente anche in molte altre pagine Web) aggiungendola alla risposta. Grazie per aver sollevato questo punto, non ero consapevole dell'importanza di questo.
Johnny,

1
I puntatori dalle fasi ai plug-in nel diagramma non sono nemmeno giusti, il jarplug-in viene effettivamente eseguito nella packagefase. 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ò.
Alexander Klimetschek l'

43

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:

  1. Ciclo vitale

    Tre built-in cicli di vita (aka cicli di vita di build ): default, clean, site. ( Riferimenti sul ciclo di vita )

  2. Fase

    Ogni ciclo di vita si compone di fasi , ad esempio per il defaultciclo di vita: compile, test, package, install, etc.

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

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

  1. una fase (ad es clean. package)
  2. <plugin-prefix>:<goal>(ad es. dependency:copy-dependencies)
  3. <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

Solo le fasi del ciclo di vita hanno davvero senso essere considerate "passi" (di un processo di costruzione). Preferirei chiamarlo 4 entità / oggetti / cose .
GeroldBroser ripristina Monica il

Quando vedo il mondo Build Phase, lo considero un'altra fase di un ciclo di vita e mi confonde.
Quazi Irfan,

26

Ritengo una buona risposta è già disponibile, ma desidero aggiungere un diagramma facile da seguire dei vari 3 cicli di vita ( build, cleane site) e le fasi in ciascuna.

inserisci qui la descrizione dell'immagine

Le fasi in grassetto - sono le fasi principali comunemente utilizzate.


2
generate-resourcesappare due volte e generate-sourcesmanca.
elingerojo,

12

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:

  • Ciclo di vita vs fase
  • Plugin vs Obiettivo

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/


2

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


4
Non deve necessariamente essere "associato a 2 o 3 goal" . Può essere anche nessuno , uno o più di tre .
GeroldBroser ripristina Monica il

1

Esistono tre cicli di vita incorporati seguenti:

  • predefinito
  • pulito
  • posto

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

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.