2014-10-28 16 views
66

Relativ neuer Entwickler hier, obwohl ich es für eine kleine Weile benutze, hoffe ich, meine Maven-Grundlagen zu festigen. Teil meines Problems ist, dass ich keine Erfahrung mit Ant habe, die von wo viele Erklärungen stammen. Ich habe gelesen und Tutorials zu beobachten, und ich höre immer wieder die gleichen Bedingungen:Maven: Lifecycle vs. Phase vs. Plugin vs Ziel

  • Lifecycle
  • Phase
  • Plugin
  • Tor

Von dem, was ich habe, ist es gelernt scheint, dass Lebenszyklus der breiteste der Reihe ist, und besteht aus (oder ergänzt durch) Phasen, Plugins und/oder Ziele.

Frage: Könnten Sie irgendwelche Informationen darüber geben, wie diese Begriffe verwandt sind und die häufigsten Beispiele?

Je expliziter und einfacher, desto besser!

+3

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html – Drejc

+0

Danke @Drejc - kann nicht glauben, dass ich das nicht bei meiner Suche gefunden habe. Ich werde es jetzt durchlesen. –

+2

Also, um zu klären, ** Build Lifecycle = Lifecycle **, von denen gibt es drei Arten: Standard, sauber und Website? Andere Erklärungen ließen mich denken, dass es einen vierten Lebenszyklus namens * build * gäbe. –

Antwort

45

@Drejc's answer ist nicht in seiner Gesamtheit korrekt.

Insbesondere:

Jede dieser Phasen ein Ziel Vor- haben oder nach einer Phase post, zum Beispiel auszuführen vor:

vorinstallieren - ...
post-paket - ...

Sie können Ziele als zusätzliche Ansicht „eingefügt“ Phasen, wenn Sie mögen.

[Streichungen von falschen Aussagen von mir.]

A Maven Lifecycle ist ein (abstrakten) Konzept, das alle Schritte umfasst (oder besser: alle Schritte die Maven Designer entschieden Unterstützung) , die voraussichtlich in der Entwicklungszeit eines Projekts auftreten. Diese Schritte (oder Stufen) sind genannt Phasen in Maven-Terminologie.

A Maven Plugin ist ein Container für/Lieferant von Ziele. Code implementiert in Zielen ist das eigentliche Arbeitspferd. (Maven in its core itself is just managing plugins and executing goals). Jedes der Ziele eines Plugins kann einer der Lebenszyklusphasen zugewiesen/gebunden werden.

beim Aufruf mvn <phase>Maven gibt alle Phasen (jedes Mal) und führt alle Ziele (von Plugins mitgeliefert) die vor und bis zu (und einschließlich) dem gegebenen irgendeinem der Phasen gebunden wurden, Phase. Wenn es eine Phase ohne Ziel gibt, wird nichts getan. Aber die Phase ist trotzdem verstrichen.

I.e. Sie können nicht "'zusätzliche Phasen einfügen" in einen von Maven integrierten Lebenszyklen. Sie sind schon da, immer! Sie könnten Ihren eigenen Lebenszyklus mit eigenen Phasen entwickeln, aber das ist weit mehr als Maven einfach zu verwenden.

Phasen "pre-install" oder "post-Paket" existieren nicht genannt.

Referenzen:

7

So ein wenig weiter als skizzierte here

Maven zu erklären Builds sind in Lebenszyklen aufgeteilt sind dies:

  • sauber
  • build (default)
  • Website

Jeder dieser Zyklen ist in Phasen unterteilt. Zum Beispiel bauen sich in Phasen aufgeteilt, wie:

  • Ressourcen vorbereiten
  • kompilieren
  • Paket
  • installieren

Phasen haben Ziele vor prä- oder nach Post laufen - eine Phase, zum Beispiel:

  • Vorreinigung - wird vor der sauberen Phase
  • post-sauber ausgeführt werden - wird

nach dem sauberen Phase ausgeführt werden Sie können Ziele als zusätzliche „eingefügt“ Phasen anzeigen, wenn Sie mögen. Lesen Sie here oder werfen Sie einen Blick auf @Gerolds answer für Details.

+1

Diese Antwort ist nicht in ihrer Gesamtheit korrekt. Siehe [meine Antwort] (http://stackoverflow.com/a/30953905/1744774). –

+0

O Junge 3 Jahre, seit Sie diese Frage beantwortet haben ... und immer noch nicht gehen lassen .. Sie gewonnen ... jetzt weitermachen. – Drejc

33

Maven: Lifecycle vs. Phase vs. Plugin vs. Tor

Answering spät nur noch eine weitere Ebene der Granularität zu klären fehlt in diesem Thread: Ausführungen (von ein Ziel), welche die kleinsten Einheiten eines Maven-Builds sind.

Daher haben wir build Zyklen (grundsätzlich für ein bestimmtes Gesamtziel der Aktionen gesetzt), die besteht aus Phasen (geringere Körnigkeit, ein Zyklusschritt), die eine Reihe von konfigurierten Zielen aufrufe kann zur Verfügung gestellt von bestimmten Plugins. Das heißt, Maven ist (auch) ein Plugin-Executor, jedes Plugin kann ein oder mehrere Ziele anbieten. Sie entscheiden dann (auch), welches Ziel an welche Phase geknüpft ist, meistens im defaul life cycle (ohne das, also den Default). Aber man kann tatsächlich noch ein weitere Ebene hat: Hinrichtung (von dem gleichen Ziel, aus dem gleichen Plugin oder verschiedenen Ziele aus verschiedenen Plugins)

Ein Bild, das ich die ganzen enter image description here

fortzusetzen vorbereitet Und in der Tat dieses ist, wie Maven es (seine kleinste Arbeitseinheit) über die eindeutige Zeichenfolge in seinem Build-Protokoll zeigt:

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 --- 

die in der Tat Mittel (durch verschiedene Ebenen der Auflösung):

  • während der compile Phase (nicht erwähnt, leider)>
  • ich das Maven Compiler-Plugin (artifactId und version) Aufruf>
  • ich Berufung auf seine compile Ziel>
  • wie durch die default-compile Ausführung definiert

Es ist einzigartig, weil Sie in der Tat das gleiche Ziel (desselben Plugins) haben könnten, das an verschiedene Phasen oder an die gleiche Phase gebunden ist, aber in verschiedenen Ausführungen (dh mit unterschiedlichen Konfigurationen). Die maven-compiler-plugin wird beispielsweise auch während der test-compile phase (einer anderen Phase) verwendet, um Testcode (über sein testCompile Ziel) in einer anderen Ausführung (default-testCompile) zu kompilieren. Sie könnten auch (während des gleichen Plugins und Ziels) automatisch generierten Code während einer anderen Phase kompilieren, die durch eine Ausführung definiert wurde, die Sie im POM angegeben haben (und möglicherweise eine andere Konfiguration).

Standardausführungen sind out-of-the-box über Maven packaging bindings vorgesehen, das heißt, standardmäßig (und Konvention über Konfiguration Durchsetzung) Maven bereits bestimmte Ziele aufrufen (der Standard-Plugins) in bestimmten Phasen. Die Ausführungs-IDs dieser Standardaufrufe sind gemäß certain conventions definiert.

Das erklärt auch warum, wenn Sie wirklich ein Standardverhalten (Bindung) eines Maven Builds überschreiben wollen, müssen Sie genau dieselbe Ausführungs-ID in Ihrem POM für dasselbe Plugin angeben (überschreiben). Sie könnten zum Beispiel die Kompilierung überspringen, indem Sie einfach eine Ausführung der maven-compiler-plugin mit der gleichen default-compile ID definieren, die jedoch an eine nicht existierende 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 standardmäßig (defaul Bindungen) zur Verfügung gestellt, die schon viel tun kann, warum die maven minimal pom von nur Linien erklärt (kompilieren, testen, Paket, usw.): Ausführen Ziele der Standard-Plugins in bestimmten Phasen : Es ist Konvention über Konfiguration. Dann können Sie über die pom.xml Konfiguration Stuff (Ausführungen) zum Build hinzufügen oder das Verhalten von bereits konfigurierten Plugins beeinflussen (in diesem Fall kein executions Abschnitt, aber nur configuration wäre genug).

Ja, Sie könnten Build-Zyklen (und ihre Phasen) überspringen und direkt Ziele (von Plugins) aufrufen. Stellen Sie sich folgendes:

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

(HINWEIS: Sie auch inline in nur einem Aufruf aufrufen könnte): sich vorstellen, wie manuelle, fehleranfällige

Hier sind wir Kompilieren App-Code, Test-Code, führen Tests und Paket das würde sich wiederholen und zeitraubend sein. Convention over configuration hilft uns: Maven führt Build-Life-Cycles und Phasen ein. Der Standardlebenszyklus (ohne Namen, d. H. Der Standard) bietet eine Reihe von Phasen basierend auf bewährten Praktiken und Konventionen (das Mantra von Maven).
Wenn Sie dasselbe wie oben erreichen möchten, führen Sie einfach mvn package aus und das Projekt wird automatisch kompiliert, getestet und verpackt. Wie? Plugins aufrufen. Das heißt, Phasen sind aussagekräftige und konfigurierbare Plugins (Goals) -Ausführungen. Um es noch mehr zu standardisieren, wird Maven für jede Phase zuerst irgendeine vorhergehende Phase aufrufen, so dass z.B. Wenn Sie testen möchten, werden Sie sicher sein, dass Sie zuerst kompilieren.

p.s. Beachten Sie, dass Sie bei der Angabe mehrerer Ziele für denselben execution im Build-Protokoll immer noch zwei verschiedene Ausführungen (mit der gleichen ID) für die zwei verschiedenen Ziele sehen (daher immer noch ein eindeutiges Tupel).

9

Kredit an Sandeep Jindal und Premraj (von hier What are Maven goals and phases and what is their difference?). Ihre Erklärung hilft mir zu verstehen.

Ich habe einige vollständige Codebeispiele erstellt & einige einfache Erklärungen hier https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/. Ich denke, es kann anderen helfen, etwas zu verstehen und etwas direkt zu versuchen.

Kurz aus dem Link sollten Sie nicht versuchen, alle drei auf einmal zu verstehen, sollten Sie zunächst die Beziehung in diesen Gruppen verstehen:

  • Life Cycle vs Phase
  • Plugin vs Tor

1. Life Cycle vs Phase

Life Cycle ist eine Sammlung von Phase in Folge, siehe hier Life Cycle References. Wenn Sie eine Phase anrufen, wird es auch alle Phase davor aufrufen.

Zum Beispiel des sauber Lebenszyklus 3 Phasen hat (Vorreinigung, sauber, Post-clean).

mvn clean 

Es rufen Vorreinigung und sauber.

2. Plugin vs Tor

Tor ist wie eine Aktion in Plugin. Wenn das Plugin also eine Klasse ist, ist das Ziel eine Methode.

Sie ein Ziel wie folgt aufrufen können.

mvn clean:clean 

Das bedeutet, „das saubere Ziel nennen, in der sauberen Plugin“ (Nichts auf die saubere Phase bezieht sich hier Sie das Wort nicht zulassen, „sauber“ verwirrend Sie, sie nicht gleich sind Siehe vollständige Erklärung oben in meinem Link)

3. Nun ist die Beziehung zwischen Phase & Tor:

Phase kann (vor) Links zu Ziel (s). Zum Beispiel, normalerweise, verbindet die saubere Phase mit dem sauberen Ziel. Also, wenn Sie diesen Befehl aufrufen:

mvn clean 

Es wird die Vorreinigung Phase nennen und die saubere Phase, die auf die saubere Links: sauber Ziel.

Es ist fast die gleiche wie:

mvn pre-clean clean:clean 
+0

@ ** 2. ** & ** 3. ** IMHO, "sauber: sauber" ist nicht die beste Wahl für ein Beispiel. Es gibt 4 Items mit dem Namen 'clean' (Lebenszyklus, Phase, Plugin, Ziel), die vor allem für Anfänger verwirrend sein können (ich erinnere mich, dass es für mich am Anfang war). @ ** 3. ** Das Verb "link" ist auch keine gute Wahl, IMHO. Der offizielle Maven Begriff ist "** bind **". –

+0

@GeroldBroser. Stimme völlig mit sauber zu: sauber. Ich hatte das erklärt und davor gewarnt, in meiner vollständigen Erklärung im Link. Ich werde diese Warnungen auch hierhin kopieren. Der Grund, warum ich es benutzt habe, weil es gut ist, Leute über dieses verwirrende Wort zu informieren, und vor allem das offizielle Maven-Dokument benutzt es und das erklärt es deutlich. Und ja, es hat mich auch verwirrt. Wie auch immer, vielen Dank für Kommentare –

+0

Tippfehler: Das offizielle Maven-Dokument verwendet es und erklärt es nicht klar –

7

Quelle: http://www.codetab.org/apache-maven-tutorial/, das wirklich gutes Tutorial

Lifecycles, Lifecycle-Phasen, Plugins und Plugin Ziele sind der Kern von Maven ist.

  • Der Maven Befehl mvn kann nur Lifecycle Phase oder Plugin Goal als Argument akzeptieren.
  • Maven kommt mit drei Lebenszyklen - Standard, sauber und Website.
  • Jeder Lebenszyklus aus Lebenszyklusphasen und in allen gemacht wird, gibt es 28 Phasen - Standard 21 (Validate, ..., kompilieren, ..., Paket, ..., Installation, Verteilung), sauber 3 (Vorreinigung, sauber, post-sauberer) und Website 4 (vor Ort, Standort, post-Ort, ort bereitstellen).
  • Wenn eine Lebenszyklusphase mit dem Befehl mvn aufgerufen wird, werden alle vorhergehenden Phasen nacheinander nacheinander ausgeführt.
  • Lebenszyklusphasen selbst haben keine Fähigkeiten, um eine Aufgabe zu erfüllen, und sie verlassen sich auf Plugins, um die Aufgabe auszuführen.
  • je nach Projekt und Verpackungsart, Maven bindet verschiedene Plugin-Ziele an die Phasen des Lebenszyklus und Ziele führen die ihnen anvertraute Aufgabe aus.

Wenn wir „mvn Paket“ in einem Java-Projekt, Maven bindet Plugin Ziele Phasen des Lebenszyklus laufen, wie in der nachfolgenden Abbildung dargestellt.

mvn-plugins-package-goal

+1

Das Material, das Sie erwähnt haben, ist ziemlich gut. Vielen Dank! –

+0

@ "_ Der Maven-Befehl ** mvn ** kann nur Lifecycle-Phase oder Plugin-Ziel als Argument akzeptieren._" ist nicht korrekt. Es akzeptiert auch [Optionen] (http://books.sonatype.com/mvnref-book/reference/running-sect-options.html). –

+0

"_Wenn wir" mvn package "in einem Java-Projekt ausführen, bindet Maven Plug-in-Ziele an die Lebenszyklusphasen_" ist nicht wahr. Die Zielbindung erfolgt lange vor dem Ausführen von 'mvn ...': In [default-bindings.xml] (https://git-wip-us.apache.org/repos/asf?p=maven.git;a=blob; f = maven-core/src/main/resources/META-INF/plexus/default-bindings.xml) oder in einem POM und nicht von Maven, sondern von einem Menschen. –

5

Und nachträglich ein weiteres Diagramm

  • Lifecycles als gelbe Rechtecke
  • Phasen von Lebenszyklen als blaue Rechtecke mit "aufrufbar" Phasen in dunkleren Blau.
  • Ziele als blaue Lutschtabletten. Die gezeigte Assoziation "Phase -> Ziel" ist die des "Gefäßes" Verpackungsmodus.
  • Plugins als grau abgeschnittene Rechtecke.

enter image description here

+0

Die graphml-Datei (bearbeitet mit dem kostenlosen yEd-Editor) ist verfügbar unter https://github.com/dtonhofer/diagrams –

+0

1) Was genau meinen Sie mit "_" aufrufbaren "phasen_", die sind "_in darker blue_"? _Alle_ Maven-Phase ist "aufrufbar" (obwohl ich sie eher _invokable_ nenne, da es keinen Code _ gibt, der direkt aufgerufen wird, indem eine Phase aufgerufen wird). Oder nennst du Phasen "_callable_", die ein Ziel haben (standardmäßig)? Nicht einmal das ist wahr, wenn man sich 'validate',' initialize' und 'verify' ansieht. –

+0

2) Das Ziel 'resources: [testR | r] esources ist NICHT an die Phasen [process-sources] oder process-test-sources im' jar'-Lebenszyklus gebunden (https: //maven.apache .org/guides/einführung/einführung-zum-lebenszyklus.html # Verpackung). –

1

LifeCycle vs Phasen: Life Cycle ist eine Sammlung von phases. Wenn Sie eine Phase aufrufen, ruft sie auch alle davor liegenden Phasen auf. Maven kommt mit 3 Einbau-Build-Lebenszyklen wie:

  1. reinigen Lifecycle- diese Reinigung des Projekts beinhaltet (für einen neuen Build & Deployment)
  2. Standard/build Lifecycle- dies die komplette Bereitstellung Griffe von Das Projekt
  3. Site Lifecycle-dies behandelt die Generierung der Java-Dokumentation des Projekts. enter image description here

Saubere Lebenszyklus hat 3 Phasen: pre-clean, sauber und post sauber. Die Phasen von Default und Site Lifecycles sind dieselben wie im Bild gezeigt.

+0

Ihr letzter Absatz ist irreführend. Vor allem der erste und der letzte Satz. _Goals_ und _phases_ sind völlig verschiedene Dinge. Sie dürfen sie nicht verwechseln, weil einige von ihnen identische Namen haben. Re "_Goals sind die Phasen, die Sie auf dem Bild oben sehen. _": Es ist kein einziges Ziel im Bild erwähnt. Dies sind alle _Phasen_. Re "_Sie schreiben den Phasennamen als 'Ziel', wenn Sie ein bestimmtes Ziel erreichen müssen. _": Obwohl es möglich ist, das Ziel eines Plugins explizit auszuführen, ist es üblich, einen Build auf eine bestimmte _phase_ mit 'mvn ' zu erstellen . Siehe meine Antwort hier. –

+0

Danke, ich habe den "Plugin vs Goal" -Teil entfernt. Ich werde es bald aktualisieren. –