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!
maven
maven-3
pom.xml
maven-lifecycle
Jeff Levine
quelle
quelle
Antworten:
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:
Maven, Einführung in den Build-Lebenszyklus
Wenn Sie sich jemals gefragt haben, woher Maven weiß, was zu tun ist, ohne dass ein Ziel im POM gebunden ist, gibt es einen Link zu
default-bindings.xml
am Ende<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml
.Die Phasen für die Einbau-Lifecycles ( sauber , Standard , Website ) in deklariert
<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 am Beispiel, 3.5. Kernkonzepte
quelle
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
Und tatsächlich zeigt Maven dies (seine kleinste Arbeitseinheit) über die eindeutige Zeichenfolge in seinem Erstellungsprotokoll:
Zum Beispiel hätten wir:
Was in der Tat bedeutet (durch unterschiedliche Granularitätsebenen):
compile
Phase (leider nicht erwähnt)>artifactId
undversion
)> aufcompile
Ziel auf>default-compile
Ausführung definiertEs 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-plugin
wird zum Beispiel auch während dertest-compile
Phase (einer anderen Phase) verwendet, um Testcode (über seintestCompile
Ziel) 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-plugin
mit derselbendefault-compile
ID 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.xml
Konfiguration können Sie dann dem Build Dinge (Ausführungen) hinzufügen oder das Verhalten bereits konfigurierter Plugins beeinflussen (in diesem Fall keinexecutions
Abschnitt, aber esconfiguration
würde einfach ausreichen).Ja, Sie können Build-Zyklen (und deren Phasen) überspringen und Ziele (von Plugins) direkt aufrufen. Stellen Sie sich Folgendes vor:
(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 package
Ihr 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
execution
im 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.quelle
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:
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 ).
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:
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:
Es wird die Vorreinigungsphase und die Reinigungsphase genannt, die mit dem Ziel "sauber: sauber" verbunden sind.
Es ist fast das gleiche wie:
quelle
clean:clean
ist nicht die beste Wahl für ein Beispiel. Es gibt 4 benannte Elementeclean
(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 ".Und verspätet ein anderes Diagramm
quelle
validate
,initialize
undverify
.resources:[testR|r]esources
Ziel ist NICHT an dieprocess-sources
oderprocess-test-sources
Phasen imjar
Lebenszyklus gebunden .modello:java
des Modello Plugins ist offenbar domänenspezifisch. Das Binden des Ziels eines Plugins an eine Phase gilt für jede der Phasen.Quelle das ist wirklich ein gutes Tutorial
Lebenszyklen, Lebenszyklusphasen, Plugins und Plugin-Ziele bilden den Kern von Maven.
Wenn wir " mvn package " in einem Java-Projekt ausführen , bindet Maven Plugin-Ziele an Lebenszyklusphasen, wie in der nächsten Abbildung gezeigt.
quelle
mvn ...
: In default-bindings.xml oder in einem POM und nicht von Maven, sondern von einem Menschen.Um es hier etwas näher zu erläutern
Maven-Builds sind in Lebenszyklen unterteilt. Dies sind:
Jeder dieser Zyklen ist in Phasen unterteilt. Zum Beispiel ist Build in Phasen unterteilt wie:
Phasen haben Ziele vor laufen Vor- oder nach post- einer Phase, zum Beispiel:
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.
quelle
LifeCycle vs Phases:
Life Cycle
ist eine Sammlung vonphases
. Wenn Sie eine Phase aufrufen, werden auch alle Phasen aufgerufen, die davor liegen. Maven verfügt über 3 integrierte Build-Lebenszyklen:Der saubere Lebenszyklus besteht aus 3 Phasen: Vorreinigung, Reinigung und Nachreinigung. Die Phasen des Standard- und Standortlebenszyklus sind dieselben wie in der Abbildung gezeigt.
quelle
mvn <phase>
. Siehe meine Antwort hier.