388 Stimmen

Was sind Maven-Ziele und Phasen und was ist ihr Unterschied?

Was ist der Unterschied / die Beziehung zwischen Maven-Zielen und Phasen? Wie sind sie miteinander verbunden?

292voto

Pace Punkte 38003

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.

233voto

Premraj Punkte 65511

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:

  1. default
  2. clean
  3. 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:

enter image description here

Referenz 1
Referenz 2

Eclipse Beispiel für die Zuordnung von Maven-Lebenszyklen

Eclipse Beispiel für Maven Lebenszyklus Zuordnung

57voto

Johnny Punkte 12351

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.

Hier Bildbeschreibung eingeben

Link zur Referenz

56voto

Sandeep Jindal Punkte 13076

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:

  1. Lebenszyklus

    Drei eingebaute Lebenszyklen (auch Build-Lebenszyklen): default, clean, site. (Lebenszyklus-Referenz)

  2. Phase

    Jeder Lebenszyklus besteht aus Phasen, z.B. für den Lebenszyklus default: compile, test, package, install, usw.

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

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

  1. einer Phase (z.B. clean, package)
  2. : (z.B. dependency:copy-dependencies)
  3. :[:]: (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

39voto

Lior Bar-On Punkte 9586

Ich glaube, dass bereits eine gute Antwort vorhanden ist, aber ich würde gerne ein leicht verständliches Diagramm der verschiedenen 3 Lebenszyklen (build, clean und site) und der Phasen in jedem hinzufügen.

Bildbeschreibung hier eingeben

Die fettgedruckten Phasen sind die Hauptphasen, die üblicherweise verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X