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 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 ....
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.
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 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:
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 installnon 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:compilePertanto, la fase è composta da obiettivi del plug-in .
Link al riferimento
mvn testpuntando packagee mvn installpuntando deploy?
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ò.
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 defaultciclo 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, cleane site) e le fasi in ciascuna.
Le fasi in grassetto - sono le fasi principali comunemente utilizzate.
generate-resourcesappare due volte e generate-sourcesmanca.
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 mvnie,mvn -X <your_goal>