Maven: Lebenszyklus vs. Phase vs. Plugin vs. Ziel [geschlossen]

106

Relativ neuer Entwickler hier, obwohl ich es schon eine Weile benutze, hoffe ich, meine Maven-Grundlagen zu festigen. Ein Teil meines Problems ist, dass ich keine Erfahrung mit Ant habe, was anscheinend darauf zurückzuführen ist, dass viele Erklärungen stammen. Ich habe Tutorials gelesen und gesehen und höre immer wieder dieselben Begriffe:

  • Lebenszyklus
  • Phase
  • Plugin
  • Tor

Nach dem, was ich gelernt habe, scheint der Lebenszyklus der breiteste zu sein und besteht aus Phasen, Plugins und / oder Zielen (oder wird durch diese abgeschlossen).

Frage : Können Sie Informationen darüber geben, wie diese Begriffe zusammenhängen und welche Beispiele am häufigsten verwendet werden?

Je expliziter und grundlegender, desto besser!

Jeff Levine
quelle
Danke @Drejc - kann nicht glauben, dass ich das bei meiner Suche nicht gefunden habe. Ich werde es jetzt durchlesen.
Jeff Levine
2
Erstellen Sie zur Verdeutlichung den Lebenszyklus = Lebenszyklus , für den es drei Typen gibt: Standard, Bereinigen und Standort? Andere Erklärungen ließen mich denken, dass es einen vierten Lebenszyklus namens Build gibt .
Jeff Levine
3
Zu umfassend? Dies betrifft Mavens Kerngrundlagen und enthält einige gute und detaillierte Antworten. Moderatoren ohne ein einziges Maven- Tag sollten dies nicht entscheiden dürfen.
Gerold Broser

Antworten:

72

Ein Maven-Lebenszyklus ist ein (abstraktes) Konzept, das alle Bereiche abdeckt Schritte (oder besser: alle Schritte, die die Maven-Designer unterstützen , die voraussichtlich während der Entwicklungslebensdauer eines Projekts auftreten werden. Diese Schritte (oder Stufen) werden in der Maven-Terminologie als Phasen bezeichnet .

Ein Maven-Plugin ist ein Container für / Anbieter von Zielen. In Zielen implementierter Code ist das eigentliche Arbeitstier. ( Maven im Kern selbst verwaltet nur Plugins und führt Ziele aus ). Jedes Ziel eines Plugins kann einer beliebigen Lebenszyklusphase zugewiesen / zugeordnet werden.

Beim Aufrufen mvn <phase> durchläuft Maven alle Phasen (jedes Mal) und führt alle Ziele (von Plugins bereitgestellt) aus , die vor und bis (einschließlich) der angegebenen Phase an eine der Phasen gebunden wurden . Wenn es eine Phase gibt, an die kein Ziel gebunden ist, wird nichts unternommen. Aber die Phase ist trotzdem vorbei.

Das heißt, Sie können keine zusätzlichen Phasen in einen der integrierten Lebenszyklen von Maven "einfügen" . Sie sind immer schon da! Sie könnten Ihren eigenen Lebenszyklus mit eigenen Phasen entwickeln, aber das geht weit über die einfache Verwendung von Maven hinaus.

Phasen mit der Bezeichnung "Pre-Install" oder "Post-Package" existieren nicht.

Verweise:

Gerold Broser
quelle
41

Maven: Lebenszyklus vs. Phase vs. Plugin vs. Ziel

Späte Antwort, nur um noch eine weitere Granularitätsstufe zu verdeutlichen, die in diesem Thread fehlt: Ausführungen (eines Ziels), die die kleinsten Einheiten eines Maven-Builds sind.

Daher haben wir Erstellungszyklen (im Grunde eine Reihe von Aktionen für ein bestimmtes Gesamtziel), die aus Phasen bestehen (geringere Granularität, ein Zyklusschritt), die eine Reihe von konfigurierten Zielen aufrufen können, die von bestimmten Plugins bereitgestellt werden . Das heißt, Maven ist (auch) ein Plugin-Executor, jedes Plugin kann ein oder mehrere Ziele bieten. Sie entscheiden dann (auch), welches Ziel mit welcher Phase verbunden ist, meistens im Standardlebenszyklus (ohne Standard, dh ohne Standard). Aber Sie können tatsächlich noch eine andere Ebene haben: Ausführungen (vom selben Ziel, vom selben Plugin oder von verschiedenen Zielen von verschiedenen Plugins)

Ein Bild, das ich vorbereitet habe, um das Ganze wieder aufzunehmen Geben Sie hier die Bildbeschreibung ein

Und tatsächlich zeigt Maven dies (seine kleinste Arbeitseinheit) über die eindeutige Zeichenfolge in seinem Erstellungsprotokoll:

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

Zum Beispiel hätten wir:

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

Was in der Tat bedeutet (durch unterschiedliche Granularitätsebenen):

  • während der compile Phase (leider nicht erwähnt)>
  • Ich rufe das Maven Compiler Plugin auf ( artifactIdundversion )> auf
  • Ich rufe es an compile Ziel auf>
  • wie durch die default-compileAusführung definiert

Es ist einzigartig, weil Sie tatsächlich dasselbe Ziel (desselben Plugins) an verschiedene Phasen oder an dieselbe Phase gebunden haben könnten, jedoch in unterschiedlichen Ausführungen (dh mit unterschiedlichen Konfigurationen). Das maven-compiler-pluginwird zum Beispiel auch während der test-compilePhase (einer anderen Phase) verwendet, um Testcode (über sein testCompileZiel) in einer anderen Ausführung zu kompilieren (default-testCompile ). Sie können auch automatisch generierten Code in einer anderen Phase kompilieren (mit demselben Plugin und Ziel), wie dies durch eine Ausführung definiert ist, die Sie im POM angegeben haben (und möglicherweise eine andere Konfiguration).

Standardausführungen werden sofort über Maven-Paketbindungen bereitgestellt, dh standardmäßig (und durchsetzen der Konvention über die Konfiguration) ruft Maven in bestimmten Phasen bereits bestimmte Ziele (von Standard-Plugins) auf. Die Ausführungs-IDs dieser Standardaufrufe werden gemäß bestimmten Konventionen definiert .

Dies erklärt auch, warum Sie, wenn Sie ein Standardverhalten (Bindung) eines Maven-Builds wirklich überschreiben möchten, genau dieselbe Ausführungs-ID in Ihrem POM für dasselbe Plugin angeben (überschreiben) müssen. Sie können beispielsweise die Kompilierung überspringen, indem Sie einfach eine Ausführung von maven-compiler-pluginmit derselben default-compileID definieren, die jedoch an eine nicht vorhandene Phase (oder eine leere) gebunden ist.

Um es kurz zu machen : Eine Ausführung teilt Maven mit, welche Ziele mit welcher Konfiguration in welcher Phase ausgeführt werden sollen.

Einige Ausführungen werden standardmäßig bereitgestellt (Standardbindungen), was erklärt, warum der minimale POM von nur 6 Zeilen bereits viel bewirken kann (Kompilieren, Testen, Packen usw.): Ausführen von Zielen von Standard-Plugins in bestimmten Phasen: Die Konvention ist beendet Aufbau. Über die pom.xmlKonfiguration können Sie dann dem Build Dinge (Ausführungen) hinzufügen oder das Verhalten bereits konfigurierter Plugins beeinflussen (in diesem Fall kein executionsAbschnitt, aber es configurationwürde einfach ausreichen).

Ja, Sie können Build-Zyklen (und deren Phasen) überspringen und Ziele (von Plugins) direkt aufrufen. Stellen Sie sich Folgendes vor:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(HINWEIS: Sie können Inline auch in nur einem Anruf aufrufen.)

Hier kompilieren wir App-Code, Testcode, führen Tests durch und verpacken: Stellen Sie sich vor, wie manuell, fehleranfällig, sich wiederholend und zeitaufwändig dies wäre. Konvention über Konfiguration hilft uns: Maven führt Build-Lebenszyklen und -phasen ein . Der Standardlebenszyklus (ohne Namen, dh der Standard) bietet eine Reihe von Phasen, die auf Best Practices und Konventionen basieren (das Mantra von Maven).
Wenn Sie dasselbe wie oben erreichen möchten, führen Sie einfach Folgendes aus: mvn packageIhr Projekt wird automatisch kompiliert, getestet und verpackt. Wie? Plugins aufrufen. Das heißt, Phasen sind sinnvolle und konfigurierbare Ausführungen von Plugins (Zielen). Um es noch standardisierter zu machen, ruft Maven für jede Phase zunächst jede vorhergehende Phase auf, sodass Sie beispielsweise beim Kompilieren sicher sein müssen, dass Sie zuerst kompilieren.

ps Beachten Sie, dass beim Angeben mehrerer Ziele für dasselbe Ziel executionim Build-Protokoll immer noch zwei verschiedene Ausführungen (mit derselben ID) für die beiden verschiedenen Ziele (daher immer noch ein eindeutiges Tupel) angezeigt werden.

A_Di-Matteo
quelle
18

Dank an Sandeep Jindal und Premraj (von hier aus Was sind Maven Ziele und Phasen und was ist ihr Unterschied? ). Ihre Erklärung hilft mir zu verstehen.

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, etwas zu verstehen und es direkt auszuprobieren.

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 davor aufgerufen .

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 "das saubere Ziel im sauberen Plugin aufrufen" (hier bezieht sich nichts auf die saubere Phase. Lassen Sie sich nicht vom Wort "sauber" verwirren, sie sind nicht dasselbe! Siehe die vollständige Erklärung in meinem Link oben)

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
Surasin Tancharoen
quelle
1
@ 2. & 3. IMHO, clean:cleanist nicht die beste Wahl für ein Beispiel. Es gibt 4 benannte Elemente clean(Lebenszyklus, Phase, Plugin, Ziel), die besonders für Anfänger verwirrend sein können (ich erinnere mich, dass es am Anfang für mich war). @ 3. Das Verb "Link" ist meiner Meinung nach auch keine gute Wahl. Der offizielle Maven-Begriff lautet " binden ".
Gerold Broser
@GeroldBroser. Stimme voll und ganz zu sauber: sauber. Ich hatte das in meiner vollständigen Erklärung im Link erklärt und gewarnt. Ich werde diese Warnungen auch hier kopieren. Der Grund, warum ich es benutzt habe, weil es gut ist, die Leute über dieses verwirrende Wort zu informieren, und insbesondere das offizielle Maven-Dokument verwendet es und das erklärt es klar. Und ja, es hat mich auch verwirrt. Wie auch immer, vielen Dank für Kommentare
Surasin Tancharoen
Tippfehler: Das offizielle Maven-Dokument verwendet es und erklärt es nicht klar
Surasin Tancharoen
17

Und verspätet ein anderes Diagramm

  • Lebenszyklen als gelbe Rechtecke
  • Phasen von Lebenszyklen als blaue Rechtecke mit "aufrufbaren" Phasen in dunklerem Blau (dh die Phasen mit Hypenierung werden normalerweise nicht über die Befehlszeile aufgerufen, da sie möglicherweise nicht dafür ausgelegt sind, das Projekt in einem genau definierten Zustand zu belassen).
  • Tore als blaue Lutschtabletten. Die angezeigte Assoziation / Bindung "Phase -> Ziel" ist die des "jar" -Verpackungsmodus . An jede Phase können Ziele gebunden sein. Dies gilt natürlich für jeden Lebenszyklus, obwohl Bindungen nur für den "Standard" -Lebenszyklus angezeigt werden.
  • Plugins als grau abgeschnittene Rechtecke. Plugins bieten die Ziele, die an die Phasen gebunden werden können.

Maven Lebenszyklen, Phasen, Ziele, Plugins

David Tonhofer
quelle
Die Graphml-Datei (bearbeitet mit dem kostenlosen yEd-Editor) ist verfügbar unter github.com/dtonhofer/diagrams
David Tonhofer
1) Was meinst du genau mit " aufrufbaren" Phasen "die" in dunklerem Blau "sind? Jede Maven-Phase ist "aufrufbar" (obwohl ich sie eher als aufrufbar bezeichne , da kein Code direkt durch Aufrufen einer Phase aufgerufen wird). Oder nennen Sie Phasen " aufrufbar ", an die ein Ziel gebunden ist (standardmäßig)? Nicht einmal das ist wahr, wenn Sie sich ansehen validate, initializeund verify.
Gerold Broser
2) Das resources:[testR|r]esourcesZiel ist NICHT an die process-sourcesoder process-test-sourcesPhasen im jarLebenszyklus gebunden .
Gerold Broser
3) modello:javades Modello Plugins ist offenbar domänenspezifisch. Das Binden des Ziels eines Plugins an eine Phase gilt für jede der Phasen.
Gerold Broser
@GeroldBroser Laut Kommentaren behoben. "Aufrufbar" bedeutet, dass man es über die Befehlszeile aufrufen kann und erwartet, dass das Projekt in einem gültigen Zustand bleibt. Es gibt keinen sinnvollen Unterschied zwischen Aufrufen und Aufrufen und Aufrufen wird in der Maven-Einführung verwendet.
David Tonhofer
12

Quelle das ist wirklich ein gutes Tutorial

Lebenszyklen, Lebenszyklusphasen, Plugins und Plugin-Ziele bilden den Kern von Maven.

  • Der Maven-Befehl mvn kann nur Lifecycle Phase oder Plugin Goal als Argument akzeptieren.
  • Maven kommt mit drei Lebenszyklen - Standard, sauber und Standort.
  • Jeder Lebenszyklus besteht aus Lebenszyklusphasen und insgesamt gibt es 28 Phasen - Standard 21 ( validieren, ..., kompilieren, ..., packen, ..., installieren, bereitstellen ), bereinigen 3 ( vorbereinigen, Clean, Post-Clean ) und Site 4 ( Pre-Site, Site, Post-Site, Site-Deployment ).
  • Wenn eine Lebenszyklusphase mit dem Befehl mvn aufgerufen wird, werden alle vorhergehenden Phasen nacheinander ausgeführt.
  • Lebenszyklusphasen selbst haben keine Fähigkeit, eine Aufgabe zu erfüllen, und sie verlassen sich auf Plugins, um die Aufgabe auszuführen.
  • Je nach Projekt und Verpackungstyp bindet Maven verschiedene Plugin-Ziele an Lebenszyklusphasen und Ziele, die die ihnen anvertraute Aufgabe ausführen.

Wenn wir " mvn package " in einem Java-Projekt ausführen , bindet Maven Plugin-Ziele an Lebenszyklusphasen, wie in der nächsten Abbildung gezeigt.

MVN-Plugins-Paket-Ziel

Erlan
quelle
1
Das Material, das Sie erwähnt haben, ist ziemlich gut. Danke dir!
William Kinaan
@ " Der Maven-Befehl mvn kann nur Lifecycle Phase oder Plugin Goal als Argument akzeptieren. " Ist nicht korrekt. Es werden auch Optionen akzeptiert .
Gerold Broser
" Wenn wir" mvn package "in einem Java-Projekt ausführen, bindet Maven Plugin-Ziele an Lebenszyklusphasen " ist nicht wahr. Die Zielbindung erfolgt lange vor dem Ausführen mvn ...: In default-bindings.xml oder in einem POM und nicht von Maven, sondern von einem Menschen.
Gerold Broser
7

Um es hier etwas näher zu erläutern

Maven-Builds sind in Lebenszyklen unterteilt. Dies sind:

  • reinigen
  • build (Standard)
  • Seite? ˅

Jeder dieser Zyklen ist in Phasen unterteilt. Zum Beispiel ist Build in Phasen unterteilt wie:

  • Ressourcen vorbereiten
  • kompilieren
  • Paket
  • Installieren

Phasen haben Ziele vor laufen Vor- oder nach post- einer Phase, zum Beispiel:

  • Vorreinigung - wird vor der Reinigungsphase ausgeführt
  • Nachreinigung - wird nach der Bereinigungsphase ausgeführt

Sie können Ziele als zusätzliche "eingefügte" Phasen anzeigen, wenn Sie möchten. Lesen Sie hier oder werfen Sie einen Blick auf @Gerolds Antwort für Details.

Drejc
quelle
1
Diese Antwort ist nicht vollständig korrekt. Siehe meine Antwort .
Gerold Broser
O Junge, 3 Jahre, seit du diese Frage beantwortet hast ... und sie immer noch nicht loslässt ... du hast gewonnen ... jetzt mach weiter.
Drejc
Es geht nicht darum zu gewinnen. Überarbeiten Sie nicht alte Fragen, Antworten und Kommentare, wenn Sie später darauf stoßen?
Gerold Broser
3

LifeCycle vs Phases: Life Cycle ist eine Sammlung von phases. Wenn Sie eine Phase aufrufen, werden auch alle Phasen aufgerufen, die davor liegen. Maven verfügt über 3 integrierte Build-Lebenszyklen:

  1. Sauberer Lebenszyklus - Dies beinhaltet die Reinigung des Projekts (für einen neuen Build und eine neue Bereitstellung).
  2. Standard- / Build-Lebenszyklus - Hiermit wird die vollständige Bereitstellung des Projekts abgewickelt
  3. Site-Lebenszyklus - Hiermit wird die Java-Dokumentation des Projekts erstellt. Geben Sie hier die Bildbeschreibung ein

Der saubere Lebenszyklus besteht aus 3 Phasen: Vorreinigung, Reinigung und Nachreinigung. Die Phasen des Standard- und Standortlebenszyklus sind dieselben wie in der Abbildung gezeigt.

Arun Raaj
quelle
Ihr letzter Absatz ist irreführend. Besonders der erste und der letzte Satz. Ziele und Phasen sind völlig verschiedene Dinge. Sie dürfen sie nicht verwechseln, da einige von ihnen identische Namen haben. Zu " Ziele sind die Phasen, die Sie im obigen Bild sehen. ": Auf dem Bild ist kein einziges Ziel erwähnt. Dies sind alles Phasen . Betreff " Sie schreiben den Phasennamen als 'Ziel', wenn Sie ein bestimmtes Ziel ausführen müssen. ": Während es möglich ist, das Ziel eines Plugins explizit auszuführen, besteht die übliche Methode darin, einen Aufbau bis zu einer bestimmten Phase mit durchzuführen mvn <phase>. Siehe meine Antwort hier.
Gerold Broser
Danke, ich habe den Teil "Plugin vs Goal" entfernt. Ich werde es bald aktualisieren.
Arun Raaj