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
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).
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html – Drejc
Danke @Drejc - kann nicht glauben, dass ich das nicht bei meiner Suche gefunden habe. Ich werde es jetzt durchlesen. –
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. –