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
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 (
artifactId
undversion
)> auf
- Ich rufe es an
compile
Ziel auf>
- wie durch die
default-compile
Ausfü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-plugin
wird zum Beispiel auch während der test-compile
Phase (einer anderen Phase) verwendet, um Testcode (über sein testCompile
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 derselben default-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 kein executions
Abschnitt, aber es configuration
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:
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 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.