Relativ neuer Entwickler hier, obwohl ich es für eine Weile benutzt habe, hoffe ich, meine Maven-Grundlagen zu festigen. Ein Teil meines Problems ist, dass ich nein Erfahrung mit Ant habe, aus der scheinbar viele Erklärungen stammen. Ich habe Tutorials gelesen und angesehen und höre immer wieder die gleichen Begriffe:
Nach dem, was ich gelernt habe, scheint der Lebenszyklus der umfangreichste zu sein und besteht aus (oder wird durch) Phasen, Plugins und/oder Zielen.
Frage: Können Sie uns mitteilen, wie diese Begriffe zusammenhängen und welche Beispiele am häufigsten vorkommen?
Je expliziter und grundlegender, desto besser!
@Drejcs Antwort ist in seiner Gesamtheit nicht korrekt.
Bestimmtes:
Jede dieser Phasen kann ein Ziel haben
vor oder nach einer Phase, zum Beispiel:
•vorinstallation - ...
•post-Paket - ...Sie können Tore als zusätzliche "eingefügte" Phasen anzeigen, wenn Sie möchten.
[Durchgestrichene falsche Angaben von mir.]
Ein Maven-Lebenszyklus ist ein (abstraktes) Konzept, das alle Schritte (oder besser: alle Schritte der Maven-Designer) abdeckt beschlossen,) zu unterstützen, die voraussichtlich während der Entwicklungszeit eines Projekts auftreten werden. Diese Schritte (oder Phasen) werden genannt Phasen in der Maven-Terminologie.
Ein Maven-Plugin ist ein Container für/Lieferant von Zielen. Code, der in Zielen implementiert ist, ist das eigentliche Arbeitstier. ( Maven selbst verwaltet nur Plugins und führt Ziele aus ). Jedes Ziel eines Plugins kann einer beliebigen Lebenszyklusphase zugewiesen/zugeordnet werden.
Beim Aufrufen von mvn <phase>
übergibt Maven alle Phasen (jedes Mal) und führt alle Ziele aus (von Plugins bereitgestellt) , die vor und bis zu der angegebenen Phase an eine der Phasen gebunden wurden (und diese enthalten). Wenn es eine Phase gibt, an die kein Ziel gebunden ist, wird nichts getan. Die Phase ist aber trotzdem vorbei.
Das heißt Sie können nicht "'zusätzliche Phasen einfügen" in einen der integrierten Lebenszyklen von Maven. Sie sind schon da, immer! Sie könnten Ihren eigenen Lebenszyklus mit eigenen Phasen entwickeln, aber das geht weit über die reine Verwendung von Maven hinaus.
Phasen mit dem Namen "Pre-Install" oder "Post-Package" existieren nicht.
Verweise:
Maven, Einführung in den Build-Lebenszyklus
Wenn Sie sich jemals gefragt haben, wie Maven wissen soll, was ohne Zielbindung im POM zu tun ist, finden Sie am Ende einen Link zu default-bindings.xml
, der sich in <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml
Befindet.
Die Phasen für die eingebauten Lebenszyklen ( Clean, Default, Site) werden in <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xml
unter .../<component>/<role>org.Apache.maven.lifecycle.Lifecycle
.
Maven: Die vollständige Referenz, Kapitel 4. Der Build-Lebenszyklus
Maven: Lebenszyklus vs. Phase vs. Plugin vs. Ziel
Später antworten, nur um ein weiteres Maß an Granularität zu verdeutlichen, das in diesem Thread fehlt: Ausführungen (eines Ziels), die kleinsten Einheiten eines Maven-Builds.
Wir haben also Zyklen aufbauen (im Grunde genommen eine Menge von Aktionen für ein bestimmtes Gesamtziel), die aus Phasen (niedrigere Granularität, ein Zyklusschritt) bestehen. die eine Reihe von konfigurierten Zielen aufrufen können bereitgestellt von bestimmten Plugins. 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, und zwar die meiste Zeit im Standardlebenszyklus (ohne das dies der Standard ist). Sie können jedoch auch eine andere Ebene haben: Ausführungen (mit demselben Ziel, mit demselben Plugin oder mit unterschiedlichen Zielen mit unterschiedlichen Plugins).
Ein Bild, das ich vorbereitete, um das Ganze wieder aufzunehmen
Und tatsächlich zeigt Maven dies (seine kleinste Arbeitseinheit) über die eindeutige Zeichenfolge in seinem Build-Protokoll:
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 (durch unterschiedliche Granularitätsebenen) bedeutet:
compile
Phase (leider nicht erwähnt)>artifactId
und version
)> aufcompile
Ziel> aufdefault-compile
definiertDies ist einzigartig, da Sie in der Tat das gleiche Ziel (desselben Plugins) an verschiedene Phasen oder an dieselbe Phase, jedoch in unterschiedlichen Ausführungen (dh mit unterschiedlichen Konfigurationen) gebunden haben könnten. Der maven-compiler-plugin
Wird beispielsweise auch während der test-compile
- Phase (einer anderen Phase) verwendet, um den Testcode zu kompilieren (über sein testCompile
goal) in einer anderen Ausführung (default-testCompile
). Sie können auch (mit demselben Plugin und Ziel) einen automatisch generierten Code in einer anderen Phase kompilieren, die durch eine von Ihnen im POM angegebene Ausführung (und möglicherweise eine andere Konfiguration) definiert wurde.
Standardausführungen werden standardmäßig über Maven-Paketbindungen bereitgestellt. Dies bedeutet, dass Maven in bestimmten Phasen bereits bestimmte Ziele (von Standard-Plugins) aufruft (und die Konvention über die Konfiguration erzwingt). 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 des maven-compiler-plugin
Mit derselben default-compile
- ID definieren, die jedoch an eine nicht vorhandene (oder eine leere) Phase 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 die maven minimal pom von nur 6 Zeilen bereits viel können (kompilieren, testen, packen, etc.): Ziele von Standard-Plugins in bestimmten Phasen ausführen: Konvention über Konfiguration. Dann können Sie über die pom.xml
- Konfiguration stuff (Ausführungen) zum Build hinzufügen oder das Verhalten bereits konfigurierter Plugins beeinflussen (in diesem Fall kein Abschnitt executions
, aber nur configuration
würde 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 Aufruf aufrufen.)
Hier kompilieren wir App-Code, testen Code, führen Tests und Pakete aus: Stellen Sie sich vor, wie manuell, fehleranfällig, sich wiederholend und zeitaufwändig dies sein würde. Konvention über Konfiguration hilft uns: Maven führt Build-Lebenszyklen und Phasen ein. Der voreingestellte Lebenszyklus (dh der voreingestellte Lebenszyklus ohne Namen) bietet eine Reihe von Phasen, die auf bewährten Praktiken und Konventionen (dem Mantra von Maven) basieren.
Wenn Sie dasselbe wie oben erreichen möchten, führen Sie einfach Folgendes aus: mvn package
Und das Projekt wird automatisch kompiliert, getestet und gepackt. Wie? Plugins aufrufen. Das heißt, Phasen sind sinnvolle und konfigurierbare Plugins (Ziele). Um es noch standardisierter zu machen, ruft Maven für jede Phase zuerst eine vorangehende Phase auf, so dass z. Wenn Sie testen möchten, können Sie sicher sein, dass Sie zuerst kompilieren.
p.s. Beachten Sie, dass bei der Angabe mehrerer Ziele für dasselbe execution
im Build-Protokoll immer noch zwei verschiedene Ausführungen (mit derselben ID) für die beiden unterschiedlichen Ziele angezeigt werden (daher immer noch eindeutiges Tupel).
Gutschrift 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 direkt zu versuchen.
Kurz gesagt, Sie sollten nicht versuchen, alle drei auf einmal zu verstehen. Zuerst sollten Sie die Beziehung in diesen Gruppen verstehen:
1. Lebenszyklus vs Phase
Lebenszyklus ist eine Sammlung von Phasen in der Reihenfolge, siehe hier - Lebenszyklus-Referenzen . 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 Pre-Clean und Clean aufgerufen.
2. Plugin vs Goal
Ziel ist wie eine Aktion im Plugin . Wenn also das Plugin eine Klasse ist, ist das Ziel eine Methode.
du kannst ein Ziel wie dieses nennen:
mvn clean:clean
Dies bedeutet "Nenne das saubere Ziel im sauberen Plugin" (Nichts bezieht sich auf die saubere Phase hier. Lass dich nicht vom Wort "reinigen" verwirren, sie sind nicht gleich! Siehe die vollständige Erklärung in meinem Link oben)
3. Nun die Beziehung zwischen Phase & Ziel:
Phase kann (vor) Links zu Ziel (s) enthalten. Zum Beispiel Normalerweise ist die Clean-Phase mit dem Clean-Ziel verknüpft. Wenn Sie diesen Befehl aufrufen:
mvn clean
Es wird die Pre-Clean-Phase und die Clean-Phase genannt, die mit dem Clean: Clean-Ziel verknüpft ist.
Es ist fast das gleiche wie:
mvn pre-clean clean:clean
Und nachträglich ein anderes Diagramm
Quelle: http://www.codetab.org/Apache-maven-tutorial/ , das ist wirklich ein gutes Tutorial
Lebenszyklen, Lebenszyklusphasen, Plugins und Plugin-Ziele bilden den Kern von Maven.
Wenn wir " mvn package" in einem Java Project ausführen, bindet Maven Plugin-Ziele an Lebenszyklusphasen, wie in der nächsten Abbildung gezeigt.
Also, um es ein wenig weiter zu erklären, wie es umrissen ist hier
Maven-Builds sind in folgende Lebenszyklen unterteilt:
Jeder dieser Zyklen ist in Phasen unterteilt. Zum Beispiel ist der Build in folgende Phasen unterteilt:
Phasen haben Ziele, die vor vor oder nach nach einer Phase ausgeführt werden sollen , zum Beispiel:
Sie können Ziele als zusätzliche "eingefügte" Phasen anzeigen, wenn Sie möchten. Lesen Sie hier oder schauen Sie @ Gerolds Antwort für Details.
Lebenszyklus gegen Phasen: Life Cycle
ist eine Sammlung von phases
. Wenn Sie eine Phase aufrufen, werden auch alle vorhergehenden Phasen aufgerufen. Maven kommt mit 3 eingebauten Build-Lebenszyklen als:
Der saubere Lebenszyklus besteht aus drei Phasen: Vorreinigung, Reinigung und Nachreinigung. Die Phasen der Standard- und Standortlebenszyklen stimmen mit den in der Abbildung gezeigten überein.