Was ist der Unterschied / die Beziehung zwischen Maven-Zielen und Phasen? Wie sind sie miteinander verbunden?
Antworten
Zu viele Anzeigen?Ziele werden in Phasen ausgeführt, die die Reihenfolge bestimmen, in der Ziele ausgeführt werden. Das beste Verständnis dafür ist, sich die Standard-Maven-Lifecycle-Bindungen anzusehen, die zeigen, welche Ziele standardmäßig in welchen Phasen ausgeführt werden. Die Ziele der compile
-Phase werden immer vor den Zielen der test
-Phase ausgeführt, die wiederum vor den Zielen der package
-Phase und so weiter.
Ein Teil der Verwirrung wird dadurch verschärft, dass Sie bei der Ausführung von Maven ein Ziel oder eine Phase angeben können. Wenn Sie eine Phase angeben, führt Maven alle Phasen bis zur angegebenen Phase in der Reihenfolge aus (z. B. wenn Sie package angeben, wird zuerst die compile-Phase und dann die test-Phase und schließlich die package-Phase durchgeführt), und für jede Phase werden alle Ziele ausgeführt, die dieser Phase zugeordnet sind.
Wenn Sie in Ihrer Maven-Build-Datei eine Plugin-Ausführung erstellen und nur das Ziel angeben, wird dieses Ziel standardmäßig an eine bestimmte Phase gebunden. Zum Beispiel wird das Ziel jaxb:xjc
standardmäßig an die generate-resources
-Phase gebunden. Wenn Sie die Ausführung jedoch spezifizieren, können Sie auch explizit die Phase für dieses Ziel angeben.
Wenn Sie bei der Ausführung von Maven ein Ziel angeben, wird nur dieses Ziel ausgeführt. Mit anderen Worten, wenn Sie das Ziel jar:jar
angeben, wird nur das jar:jar
-Ziel ausgeführt, um Ihren Code in ein Jar zu packen. Wenn Sie zuvor nicht das compile-Ziel ausgeführt oder Ihren kompilierten Code anderweitig vorbereitet haben, wird dies sehr wahrscheinlich fehlschlagen.
Der Lebenszyklus ist eine Abfolge von benannten Phasen.
Die Phasen werden nacheinander ausgeführt. Das Ausführen einer Phase bedeutet, dass alle vorherigen Phasen ausgeführt werden.Ein Plugin ist eine Sammlung von Zielen (d.h. Aufgaben), die auch MOJO genannt werden (Maven Old Java Object).
Maven basiert auf dem zentralen Konzept eines Build-Life-Zyklus. Innerhalb jedes Build-Lebenszyklus gibt es Build-Phasen und innerhalb jeder Build-Phasen gibt es Build-Ziele.
Wir können entweder eine Build-Phase oder ein Build-Ziel ausführen. Beim Ausführen einer Build-Phase werden alle Build-Ziele innerhalb dieser Build-Phase ausgeführt. Build-Ziele sind einer oder mehreren Build-Phasen zugeordnet. Wir können auch ein Build-Ziel direkt ausführen.
Es gibt drei Haupt eingebaute Build-Lebenszyklen:
- default
- clean
- site
Jeder Build-Lebenszyklus besteht aus Phasen
Zum Beispiel besteht der default
Lebenszyklus aus den folgenden Build-Phasen:
validate - Überprüfen, ob das Projekt korrekt ist und alle notwendigen Informationen vorhanden sind
compile - Kompilieren des Quellcodes des Projekts
test - Testen des kompilierten Quellcodes mit einem geeigneten Unit-Test-Framework. Diese Tests erfordern nicht, dass der Code verpackt oder bereitgestellt wird
package - Nehmen Sie den kompilierten Code und packen Sie ihn in sein verteilbares Format, z.B. ein JAR.
integration-test - Prozess und Bereitstellung des Pakets, falls erforderlich, in eine Umgebung, in der Integrationstests durchgeführt werden können
verify - Führen Sie Überprüfungen durch, um sicherzustellen, dass das Paket gültig ist und Qualitätskriterien erfüllt
install - Installieren des Pakets im lokalen Repository zur Verwendung als Abhängigkeit in anderen Projekten lokal
deploy - Wird in einer Integrations- oder Release-Umgebung durchgeführt, kopiert das endgültige Paket in das Remote-Repository zum Teilen mit anderen Entwicklern und Projekten.
Um die obigen Phasen durchzugehen, müssen wir nur einen Befehl aufrufen:
mvn { Beispiel: mvn install }
Für den obigen Befehl werden beginnend mit der ersten Phase alle Phasen sequenziell bis zur Phase 'install' ausgeführt. mvn
kann entweder ein Ziel oder eine Phase ausführen (oder sogar mehrere Ziele oder mehrere Phasen) wie folgt:
mvn clean install plugin:goal
Wenn Sie jedoch den Präfix, der zur Referenzierung Ihres Plugins verwendet wird, anpassen möchten, können Sie den Präfix direkt über einen Konfigurationsparameter im maven-plugin-plugin
in Ihrem Plugin-POM angeben.
Eine Build-Phase besteht aus Plugin-Zielen
Der Großteil der Funktionalität von Maven erfolgt über Plugins. Ein Plugin bietet eine Reihe von Zielen, die mit der folgenden Syntax ausgeführt werden können:
mvn [plugin-name]:[goal-name]
Zum Beispiel kann ein Java-Projekt mit dem Compiler-Plugin und dessen compile-Ziel kompiliert werden, indem mvn compiler:compile
ausgeführt wird.
Der Build-Lebenszyklus ist eine Liste von benannten Phasen, die verwendet werden können, um die Reihenfolge der Ziel-Ausführung festzulegen.
Die von Plugins bereitgestellten Ziele können mit verschiedenen Phasen des Lebenszyklus verknüpft werden. Zum Beispiel ist das Ziel compiler:compile
standardmäßig mit der compile
Phase verbunden, während das Ziel surefire:test
mit der test
Phase verbunden ist. Berücksichtigen Sie den folgenden Befehl:
mvn test
Wenn der vorherige Befehl ausgeführt wird, führt Maven alle Ziele aus, die mit jeder der Phasen bis einschließlich der test
Phase verbunden sind. In einem solchen Fall führt Maven das resources:resources
Ziel aus, das mit der process-resources
Phase verbunden ist, dann compiler:compile
und so weiter, bis es schließlich das surefire:test
Ziel ausführt.
Dennoch kann eine Build-Phase für einen spezifischen Schritt im Build-Lebenszyklus verantwortlich sein, die Art und Weise, wie sie diese Verantwortlichkeiten wahrnimmt, kann variieren. Und dies geschieht, indem die Plugin-Ziele deklariert werden, die an diese Build-Phasen gebunden sind.
Ein Plugin-Ziel repräsentiert eine spezifische Aufgabe (differenzierter als eine Build-Phase), die zum Aufbau und zur Verwaltung eines Projekts beiträgt. Es kann mit null oder mehr Build-Phasen verbunden sein. Ein Ziel, das an keiner Build-Phase gebunden ist, kann außerhalb des Build-Lebenszyklus durch direkten Aufruf ausgeführt werden. Die Ausführungsreihenfolge hängt von der Reihenfolge ab, in der das Ziel bzw. die Ziele und die Build-Phase(n) aufgerufen werden. Betrachten Sie zum Beispiel den folgenden Befehl. Die Argumente clean
und package
sind Build-Phasen, während dependency:copy-dependencies
ein Ziel (eines Plugins) ist.
mvn clean dependency:copy-dependencies package
Wenn dies ausgeführt würde, würde die clean
Phase zuerst ausgeführt (was bedeutet, dass alle vorherigen Phasen des clean-Lebenszyklus sowie die clean
Phase selbst ausgeführt werden), dann das dependency:copy-dependencies
Ziel, bevor schließlich die package
Phase ausgeführt wird (und alle vorherigen Build-Phasen des default-Lebenszyklus).
Darüber hinaus, wenn ein Ziel an eine oder mehrere Build-Phasen gebunden ist, wird dieses Ziel in all diesen Phasen aufgerufen.
Des Weiteren kann eine Build-Phase auch null oder mehr Ziele an sie gebunden haben. Wenn eine Build-Phase keine Ziele hat, die mit ihr verbunden sind, wird diese Build-Phase nicht ausgeführt. Hat sie jedoch ein oder mehr Ziele an sie gebunden, werden alle diese Ziele ausgeführt.
Eingebaute Lebenszyklus-Bindungen
Einige Phasen haben standardmäßig Ziele mit ihnen verknüpft. Und für den Standardlebenszyklus hängen diese Bindungen vom Verpackungswert ab.
Maven Architektur:
Eclipse Beispiel für die Zuordnung von Maven-Lebenszyklen
Die gewählte Antwort ist großartig, aber trotzdem möchte ich noch etwas Kleines zum Thema hinzufügen. Eine Illustration.
Es zeigt deutlich, wie die verschiedenen Phasen an verschiedene Plugins gebunden sind und die Ziele, die diese Plugins freigeben.
Also, betrachten wir einen Fall, in dem so etwas wie mvn compile
ausgeführt wird:
- Es ist eine Phase, die das Compiler-Plugin mit dem Compile-Goal ausführt
- Der Compiler-Plugin hat verschiedene Ziele. Für
mvn compile
ist es auf ein bestimmtes Ziel, das Compile-Ziel, abgebildet. - Es ist dasselbe wie das Ausführen von
mvn compiler:compile
Daher besteht eine Phase aus Plugin-Zielen.
Link zur Referenz
Die Definitionen sind detailliert auf der Seite der Maven-Website Einführung in den Build-Lebenszyklus aufgeführt, aber ich habe versucht, es zu zusammenzufassen:
Maven definiert 4 Elemente eines Build-Prozesses:
-
Lebenszyklus
Drei eingebaute Lebenszyklen (auch Build-Lebenszyklen):
default
,clean
,site
. (Lebenszyklus-Referenz) -
Phase
Jeder Lebenszyklus besteht aus Phasen, z.B. für den Lebenszyklus
default
:compile
,test
,package
,install
, usw. -
Plugin
Ein Artefakt, das ein oder mehrere Ziele bereitstellt.
Basierend auf dem Verpackungstyp (
jar
,war
, etc.) sind die Ziele der Plugins standardmäßig an Phasen gebunden. (Standardmäßige Lebenszyklus-Bindungen) -
Ziel
Die Aufgabe (Aktion), die ausgeführt wird. Ein Plugin kann ein oder mehrere Ziele haben.
Eins oder mehrere Ziele müssen beim Konfigurieren eines Plugins in einem POM angegeben werden. Zusätzlich, falls ein Plugin keine standardmäßige Phase definiert hat, können die angegebenen Ziele an eine Phase gebunden werden.
Maven kann aufgerufen werden mit:
- einer Phase (z.B.
clean
,package
) :
(z.B.dependency:copy-dependencies
):[:]:
(z.B.org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)
mit einer oder mehreren Kombinationen von beliebig vielen davon, z.B.:
mvn clean dependency:copy-dependencies package
- See previous answers
- Weitere Antworten anzeigen