Was ist der Unterschied / die Beziehung zwischen Maven-Zielen und -Phasen? Wie hängen sie miteinander zusammen?
Was ist der Unterschied / die Beziehung zwischen Maven-Zielen und -Phasen? Wie hängen sie miteinander zusammen?
Antworten:
Ziele werden in Phasen ausgeführt, die dabei helfen, die Reihenfolge zu bestimmen, in der Ziele ausgeführt werden. Das beste Verständnis hierfür besteht darin, die Standard-Maven-Lebenszyklusbindungen zu betrachten, aus denen hervorgeht, welche Ziele standardmäßig in welchen Phasen ausgeführt werden. Die Ziele der Kompilierungsphase werden immer vor den Zielen der Testphase ausgeführt, die immer vor den Zielen der Paketphase usw. ausgeführt werden.
Ein Teil der Verwirrung wird durch die Tatsache verschärft, dass Sie beim Ausführen von Maven ein Ziel oder eine Phase angeben können. Wenn Sie eine Phase angeben, führt maven alle Phasen bis zu der von Ihnen angegebenen Phase aus (z. B. wenn Sie ein Paket angeben, durchläuft es zuerst die Kompilierungsphase und dann die Testphase und schließlich die Paketphase) und für jede Phase Führen Sie alle mit dieser Phase verbundenen Ziele aus.
Wenn Sie eine Plugin-Ausführung in Ihrer Maven-Build-Datei erstellen und nur das Ziel angeben, wird dieses Ziel an eine bestimmte Standardphase gebunden. Beispielsweise wird das Ziel jaxb: xjc standardmäßig an die Phase "Ressourcen generieren" gebunden. Wenn Sie jedoch die Ausführung angeben, können Sie auch die Phase für dieses Ziel explizit angeben.
Wenn Sie bei der Ausführung von Maven ein Ziel angeben, wird dieses Ziel und nur dieses Ziel ausgeführt. Mit anderen Worten, wenn Sie das jar: jar-Ziel angeben, wird nur das jar: jar-Ziel ausgeführt, um Ihren Code in ein jar zu packen. Wenn Sie das Kompilierungsziel zuvor noch nicht ausgeführt oder Ihren kompilierten Code auf andere Weise vorbereitet haben, kann dies sehr wahrscheinlich fehlschlagen.
mvn archetype:generate
und in diesem Fall führt maven nur das Ziel aus?
mvn test
läuft : --- 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
, während mvn compiler:testCompile
nur läuft --- maven-compiler-plugin:3.1:testCompile ...
.
mvn clean compiler:testCompile
Läufe , --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
die mit fehlschlägt 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
(wo MvnPhase
wird die Klasse im Test in der Testklasse verwiesen). Anscheinend werden Phasen nicht aufgerufen, wenn ein Ziel explizit aufgerufen wird.
Der Lebenszyklus ist eine Folge benannter Phasen .
Phasen werden nacheinander ausgeführt. Das Ausführen einer Phase bedeutet, dass alle vorherigen Phasen ausgeführt werden.Plugin ist eine Sammlung von Zielen, die auch als MOJO ( M aven O ld J ava O bject) bezeichnet werden.
Analogie: Plugin ist eine Klasse und Ziele sind Methoden innerhalb der Klasse.
Maven basiert auf dem zentralen Konzept eines Build Life Cycles . In jedem Build-Lebenszyklus gibt es Build-Phasen und in jeder Build-Phase gibt es Build-Ziele .
Wir können entweder eine Build-Phase oder ein Build-Ziel ausführen. Bei der Ausführung einer Build-Phase führen wir alle Build-Ziele innerhalb dieser Build-Phase aus. Build-Ziele werden einer oder mehreren Build-Phasen zugewiesen. Wir können ein Build-Ziel auch direkt ausführen.
Es gibt drei wichtige integrierte Build-Lebenszyklen :
Jeder Build-Lebenszyklus besteht aus Phasen
Beispielsweise default
umfasst der Lebenszyklus die folgenden Erstellungsphasen :
◾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.
Um die obigen Phasen zu durchlaufen, müssen wir nur einen Befehl aufrufen:
mvn <phase> { Ex: mvn install }
Für den obigen Befehl werden ab der ersten Phase alle Phasen nacheinander bis zur Installationsphase ausgeführt. mvn
kann entweder ein Ziel oder eine Phase (oder sogar mehrere Ziele oder mehrere Phasen) wie folgt ausführen:
mvn clean install plugin:goal
Wenn Sie jedoch das Präfix anpassen möchten, das zum Verweisen auf Ihr Plugin verwendet wird, können Sie das Präfix direkt über einen Konfigurationsparameter maven-plugin-plugin
im POM Ihres Plugins angeben .
Eine Build-Phase besteht aus Plugin- Zielen
Die meisten Funktionen von Maven sind Plugins. Ein Plugin bietet eine Reihe von Zielen , die mit der folgenden Syntax ausgeführt werden können:
mvn [plugin-name]:[goal-name]
Beispielsweise kann ein Java-Projekt durch Ausführen mit dem Kompilierungsziel des Compiler-Plugins kompiliert werden mvn compiler:compile
.
Der Build-Lebenszyklus ist eine Liste benannter Phasen, mit denen die Zielausführung angeordnet werden kann.
Von Plugins bereitgestellte Ziele können verschiedenen Phasen des Lebenszyklus zugeordnet werden. Beispielsweise ist das Ziel standardmäßig compiler:compile
der compile
Phase zugeordnet , während das Ziel surefire:test
der test
Phase zugeordnet ist . Betrachten Sie den folgenden Befehl:
mvn test
Wenn der vorhergehende Befehl ausgeführt wird, führt Maven alle Ziele aus, die jeder der Phasen bis einschließlich der test
Phase zugeordnet sind. In einem solchen Fall führt Maven dann das resources:resources
mit der process-resources
Phase verknüpfte Ziel aus compiler:compile
und so weiter, bis es schließlich das surefire:test
Ziel ausführt.
Obwohl eine Build-Phase für einen bestimmten Schritt im Build-Lebenszyklus verantwortlich ist, kann die Art und Weise, in der diese Verantwortlichkeiten ausgeführt werden, variieren. Dazu werden die Plugin-Ziele deklariert, die an diese Erstellungsphasen gebunden sind.
Ein Plugin-Ziel stellt eine bestimmte Aufgabe dar (feiner als eine Erstellungsphase), die zum Erstellen und Verwalten eines Projekts beiträgt. Es kann an null oder mehr Erstellungsphasen gebunden sein. Ein Ziel, das nicht an eine Build-Phase gebunden ist, kann außerhalb des Build-Lebenszyklus durch direkten Aufruf ausgeführt werden. Die Reihenfolge der Ausführung hängt von der Reihenfolge ab, in der die Ziele und die Erstellungsphase (n) aufgerufen werden. Betrachten Sie beispielsweise den folgenden Befehl. Die clean
und package
Argumente sind Erstellungsphasen, während das dependency:copy-dependencies
ein Ziel (eines Plugins) ist.
mvn clean dependency:copy-dependencies package
Wenn dies ausgeführt wird, wird zuerst die clean
Phase ausgeführt (dh alle vorhergehenden Phasen des sauberen Lebenszyklus sowie die clean
Phase selbst werden ausgeführt) und dann das dependency:copy-dependencies
Ziel, bevor die endgültige Ausführung ausgeführt wirdpackage
Phase (und alle vorhergehenden Erstellungsphasen von) der Standardlebenszyklus).
Wenn ein Ziel an eine oder mehrere Erstellungsphasen gebunden ist, wird dieses Ziel in allen diesen Phasen aufgerufen.
Darüber hinaus können an eine Build-Phase null oder mehr Ziele gebunden sein. Wenn an eine Erstellungsphase keine Ziele gebunden sind, wird diese Erstellungsphase nicht ausgeführt. Wenn jedoch ein oder mehrere Ziele daran gebunden sind, werden alle diese Ziele ausgeführt.
Eingebaute Lebenszyklusbindungen
einigen Phasen sind standardmäßig Ziele gebunden. Für den Standardlebenszyklus hängen diese Bindungen vom Verpackungswert ab.
Maven Architektur:
Eclipse-Beispiel für Maven Lifecycle Mapping
[plugin-name]
im Beispiel mvn [plugin-name]:[goal-name]
ist eher ein Plugin-Präfix . mvn clean install
kann nicht nur " in einem Szenario mit mehreren Modulen verwendet werden ". Multi-Modul ist ein ganz anderes Thema.
Die gewählte Antwort ist großartig, aber ich möchte dem Thema dennoch etwas Kleines hinzufügen. Eine Illustration.
Es zeigt deutlich, wie die verschiedenen Phasen an verschiedene Plugins gebunden sind und welche Ziele diese Plugins setzen.
Lassen Sie uns einen Fall untersuchen, in dem Folgendes ausgeführt wird mvn compile
:
mvn compile
es ist einem bestimmten Ziel zugeordnet, dem Kompilierungsziel.mvn compiler:compile
Daher besteht die Phase aus Plugin-Zielen .
Link zur Referenz
mvn test
zeigt auf package
und mvn install
zeigt auf deploy
?
jar
Plugin läuft tatsächlich in der package
Phase. Und der Pom im Sandwich zwischen Phasen und Plugins ist etwas verwirrend (ich nehme an, es sollte bedeuten, dass Sie im Pom zusätzlich zu den Standardbindungen konfigurieren können, welche Plugins in welchen Phasen ausgeführt werden). Das allgemeine Prinzip ist jedoch richtig.
Die Definitionen sind auf der Seite Einführung in den Build-Lebenszyklus der Maven-Site detailliert beschrieben , aber ich habe versucht, sie zusammenzufassen :
Maven definiert 4 Elemente eines Erstellungsprozesses:
Lebenszyklus
Drei eingebaute in Lifecycles (aka Build Lifecycles ): default
, clean
, site
. ( Lebenszyklusreferenz )
Phase
Jeder Lebenszyklus besteht aus aus Phasen , zB für den default
Lebenszyklus: compile
, test
, package
, install
, usw.
Plugin
Ein Artefakt, das ein oder mehrere Ziele bietet.
Basierend auf Verpackungsart ( jar
, war
usw.) Plugins' Ziele sind Phasen standardmäßig gebunden. ( Eingebaute Lebenszyklusbindungen )
Tor
Die Aufgabe (Aktion), die ausgeführt wird. Ein Plugin kann ein oder mehrere Ziele haben.
Bei der Konfiguration eines Plugins in einem POM müssen ein oder mehrere Ziele angegeben werden . Falls für ein Plugin keine Standardphase definiert ist, können die angegebenen Ziele an eine Phase gebunden werden.
Maven kann aufgerufen werden mit:
clean
, package
)<plugin-prefix>:<goal>
(zB dependency:copy-dependencies
)<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
(zB org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)mit einer oder mehreren Kombinationen von einem oder allen, z.
mvn clean dependency:copy-dependencies package
Build Phase
, sehe ich sie als eine weitere Phase in einem Lebenszyklus, und das verwirrt mich.
Ich glaube , eine gute Antwort ist bereits vorgesehen, aber ich möchte ein easy-to-follow Diagramm der verschiedenen 3 - Lebenszyklen hinzuzufügen ( build
, clean
, und site
) und die Phasen in jedem.
Die fettgedruckten Phasen sind die üblicherweise verwendeten Hauptphasen.
generate-resources
erscheint zweimal und generate-sources
fehlt.
Gutschrift an Sandeep Jindal und Premraj. Ihre Erklärung hilft mir zu verstehen, nachdem ich eine Weile darüber verwirrt war.
Ich habe hier einige vollständige Codebeispiele und einige einfache Erklärungen erstellt. Https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Ich denke, es kann anderen helfen, zu verstehen.
Kurz gesagt, Sie sollten nicht versuchen, alle drei gleichzeitig zu verstehen. Zuerst sollten Sie die Beziehung in diesen Gruppen verstehen:
1. Lebenszyklus gegen Phase
Der Lebenszyklus ist eine Sammlung von Phasen nacheinander, siehe hier Lebenszyklusreferenzen . Wenn Sie eine Phase aufrufen , werden auch alle Phasen aufgerufen davor .
Zum Beispiel hat der saubere Lebenszyklus 3 Phasen ( Vorreinigung, Reinigung, Nachreinigung ).
mvn clean
Es wird Vorreinigung und Reinigung genannt .
2. Plugin gegen Ziel
Ziel ist wie eine Aktion im Plugin . Wenn das Plugin eine Klasse ist, ist das Ziel eine Methode.
Sie können ein Ziel wie folgt nennen:
mvn clean:clean
Dies bedeutet "Aufruf des sauberen Ziels im sauberen Plugin" (Hier bezieht sich nichts auf die saubere Phase. Lassen Sie sich nicht vom Wort "sauber" verwirren, sie sind nicht dasselbe!)
3. Nun die Beziehung zwischen Phase & Ziel:
Phase kann (vor) Links zu Tor (e) .Für Beispiel, in der Regel, die saubere Phase Anschluss an das sauberen Ziel. Wenn Sie diesen Befehl aufrufen:
mvn clean
Es wird die Vorreinigungsphase und die Reinigungsphase genannt, die mit dem Ziel "sauber: sauber" verbunden sind.
Es ist fast das gleiche wie:
mvn pre-clean clean:clean
Weitere Details und vollständige Beispiele finden Sie unter https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/
Maven-Arbeitsterminologie mit Phasen und Zielen.
Phase: Die Maven-Phase ist eine Reihe von Aktionen, die mit 2 oder 3 Zielen verbunden sind
Beispiel: - Wenn Sie mvn clean ausführen
In dieser Phase wird das Ziel mvn clean: clean ausgeführt
Ziel: Maven-Ziel mit der Phase begrenzt
als Referenz http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
Es gibt drei integrierte Build-Lebenszyklen:
Lebenszyklusstandard -> [validieren, initialisieren, Quellen generieren, Prozessquellen, Ressourcen generieren, Prozessressourcen, kompilieren, Prozessklassen, Testquellen generieren, Prozesstestquellen generieren, Testressourcen generieren, Prozess -Testressourcen, Testkompilieren, Prozesstestklassen, Test, Vorbereitungspaket, Paket, Test vor der Integration, Integrationstest, Test nach der Integration, Verifizieren, Installieren, Bereitstellen]
Lebenszyklus sauber -> [Vorreinigung, Reinigung, Nachreinigung]
Lebenszyklus-Site -> [Pre-Site, Site, Post-Site, Site-Deployment]
Der Ablauf ist sequentiell, z. B. für den Standardlebenszyklus . Er beginnt mit der Validierung , der Initialisierung usw.
Sie können den Lebenszyklus überprüfen, indem Sie den Debug-Modus aktivieren mvn
, z.mvn -X <your_goal>