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

Antworten:

250

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.

Tempo
quelle
11
Ich habe es sich zur Gewohnheit gemacht , zu sagen „Maven geht alle Phasen (bis zu und einschließlich der gegebenen)“ anstelle von „läuft“ oder „ausführt“ (letzteres , wie es in Maven genannt Einführung in Build Lifecycle ). Eine solche Unterscheidung macht es klarer vom Code des Ziels, der wirklich ausgeführt wird. Aber das könnte persönlicher Geschmack sein.
GeroldBroser setzt Monica am
Wir können aber auch Ziele ausführen, die keiner Phase angehören, dh mvn archetype:generateund in diesem Fall führt maven nur das Ziel aus?
Quazi Irfan
1
@Pace Haben Sie eine Referenz für den letzten Absatz? Ich habe das bezweifelt und es mit einem einfachen Projekt hier versucht: mvn testlä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:testCompilenur läuft --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser stellt Monica
4
@Pace mvn clean compiler:testCompileLäufe , --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompiledie 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 MvnPhasewird die Klasse im Test in der Testklasse verwiesen). Anscheinend werden Phasen nicht aufgerufen, wenn ein Ziel explizit aufgerufen wird.
GeroldBroser stellt Monica
1
Basierend auf den Eingaben von geroldbroser und @ kekko12 habe ich den letzten Absatz aktualisiert, um anzugeben, dass bei Angabe eines Ziels nur dieses Ziel ausgeführt wird und nicht alle vorhergehenden Phasen.
Pace
188

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 :

  1. Standard
  2. sauber
  3. Seite? ˅

Jeder Build-Lebenszyklus besteht aus Phasen

Beispielsweise defaultumfasst 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. mvnkann 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-pluginim 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:compileder 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 testPhase zugeordnet sind. In einem solchen Fall führt Maven dann das resources:resourcesmit der process-resourcesPhase verknüpfte Ziel aus compiler:compileund so weiter, bis es schließlich das surefire:testZiel 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 cleanund packageArgumente sind Erstellungsphasen, während das dependency:copy-dependenciesein Ziel (eines Plugins) ist.

mvn clean dependency:copy-dependencies package

Wenn dies ausgeführt wird, wird zuerst die cleanPhase ausgeführt (dh alle vorhergehenden Phasen des sauberen Lebenszyklus sowie die cleanPhase selbst werden ausgeführt) und dann das dependency:copy-dependenciesZiel, 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:

Geben Sie hier die Bildbeschreibung ein

Referenz 1
Referenz 2

Eclipse-Beispiel für Maven Lifecycle Mapping

Eclipse-Beispiel für Maven Lifecycle Mapping

Premraj
quelle
Wenn ich 2 Profile habe, kann ich zuerst alle Plugins von Profil 1 und dann das von Profil 2 ausführen?
Bee
[plugin-name]im Beispiel mvn [plugin-name]:[goal-name]ist eher ein Plugin-Präfix . mvn clean installkann nicht nur " in einem Szenario mit mehreren Modulen verwendet werden ". Multi-Modul ist ein ganz anderes Thema.
GeroldBroser stellt Monica
Halten sich Ziele, die mit derselben Phase verbunden sind, an eine Reihenfolge?
Aal Gheez
5
Der größte Teil dieses Textes wurde wörtlich aus der Maven-Dokumentation kopiert . Dies sollte klar angegeben werden!
Lii
tolle Quelle!
Bobo
45

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:

  • Es ist eine Phase , die den Compiler ausführen Plugin mit der Kompilierung Ziel
  • Das Compiler-Plugin hat unterschiedliche Ziele. Denn mvn compilees ist einem bestimmten Ziel zugeordnet, dem Kompilierungsziel.
  • Es ist das gleiche wie Laufen mvn compiler:compile

Daher besteht die Phase aus Plugin-Zielen .

Geben Sie hier die Bildbeschreibung ein

Link zur Referenz

Johnny
quelle
20
Warum mvn testzeigt auf packageund mvn installzeigt auf deploy?
Abdull
2
Sieht aus wie ein Illustrationsfehler, danke, dass Sie es bemerkt haben (im Web gegründet).
Johnny
3
Woher hast du die Illustration? Haben Sie das Urheberrecht und die Nutzungsbedingungen überprüft?
Abdull
1
@Abdulles Bild von hier aufgenommen carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (und es erscheint auch auf vielen anderen Webseiten), das der Antwort hinzugefügt wird. Vielen Dank, dass Sie diesen Punkt angesprochen haben. Ich war mir der Bedeutung nicht bewusst.
Johnny
1
Die Zeiger von Phasen zu Plugins im Diagramm sind auch nicht ganz richtig, das jarPlugin läuft tatsächlich in der packagePhase. 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.
Alexander Klimetschek
43

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:

  1. Lebenszyklus

    Drei eingebaute in Lifecycles (aka Build Lifecycles ): default, clean, site. ( Lebenszyklusreferenz )

  2. Phase

    Jeder Lebenszyklus besteht aus aus Phasen , zB für den defaultLebenszyklus: compile, test, package, install, usw.

  3. Plugin

    Ein Artefakt, das ein oder mehrere Ziele bietet.

    Basierend auf Verpackungsart ( jar, warusw.) Plugins' Ziele sind Phasen standardmäßig gebunden. ( Eingebaute Lebenszyklusbindungen )

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

  1. eine Phase (z clean, package)
  2. <plugin-prefix>:<goal>(zB dependency:copy-dependencies)
  3. <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
Sandeep Jindal
quelle
Nur Lebenszyklusphasen sind wirklich sinnvoll, um als "Schritte" (eines Erstellungsprozesses) betrachtet zu werden. Ich würde es lieber 4 Entitäten / Gegenstände / Dinge nennen .
GeroldBroser setzt Monica am
Wenn ich die Welt sehe Build Phase , sehe ich sie als eine weitere Phase in einem Lebenszyklus, und das verwirrt mich.
Quazi Irfan
26

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.

Geben Sie hier die Bildbeschreibung ein

Die fettgedruckten Phasen sind die üblicherweise verwendeten Hauptphasen.

Lior Bar-On
quelle
2
generate-resourceserscheint zweimal und generate-sourcesfehlt.
Elingerojo
12

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:

  • Lebenszyklus gegen Phase
  • Plugin gegen Ziel

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/

Surasin Tancharoen
quelle
2

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

Venky Vungarala
quelle
4
Es muss nicht unbedingt "mit 2 oder 3 Toren verbunden" sein . Es kann auch keine , eine oder mehr als drei sein .
GeroldBroser setzt Monica am
1

Es gibt drei integrierte Build-Lebenszyklen:

  • Standard
  • sauber
  • Seite? ˅

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>

Vishrant
quelle