Frage

Ich weiß, es ist mauvais ton zweimal an einem einzigen Tag zu fragen, aber hier ist eine andere Maven Puzzler:

Ich habe eine übergeordnete POM, die 5 Module definiert (5 Teilprojekte). Da jedes Modul auf genau die gleiche Art und Weise ausgeführt wird, ziehe ich <profile><build> Abschnitt in das übergeordnete POM des doppelten Code loszuwerden. Nun - wenn ich von jedem Modul bauen einzeln ausführen es funktioniert, aber wenn ich auf einmal alle Module aufbauen will und auf das übergeordnete Verzeichnis verschieben ich Fehler habe seit der allererste, was Maven auszuführen versucht, ist das übergeordnete Projekt selbst:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

Danach Build schlägt fehl, da exec-Plugin versucht, etwas auszuführen, die nicht da ist. Mit Blick auf den Ausgang ist es ziemlich offensichtlich, dass Reaktor Plugin die Build fährt aber wie kann ich konfigurieren Reaktor die Eltern überspringen?

P. S. Um Verwirrung zu vermeiden - ich versuche Profil Ausführung auf die Eltern zu unterdrücken und ermöglichen es auf das Kind während der same build

War es hilfreich?

Lösung

Was durch den Bau der Eltern falsch?

In der Tat, in Maven gibt es zwei unterschiedliche Konzepte (die zugleich allgemein verwendet werden):

  • Das übergeordnete POM
  • Die Module Aggregation

Die erste ist eine Definition von allem, was mit allen Kindern gemeinsam ist. Sie definieren einen Elternteil als Pom-verpackt Projekt, und Sie können es in Ihrem Repository installieren.

Wenn Sie ein Kind dieser Eltern bauen, Maven2 wird diese Eltern rufen die Eltern pom mit dem Kind pom zu verschmelzen. Sie können einen Blick auf die gesamte pom.xml haben, indem Sie den Befehl mvn help:effective-pom ausgeführt wird.

In diesem Fall wird die Mutter pom nicht gebaut wird, wird es nur aus dem Repository abgerufen werden.

Der zweite Fall ist ein Projekt, das eine modules Liste der Unterprojekte enthält. Das Prinzip ist, dass jeder Befehl, den Sie an diesem Projekt laufen auch auf alle Untermodule ausgeführt werden. Die Reihenfolge der Module wird durch den Reaktor definiert werden, die auf der inter-Module Abhängigkeiten aussehen zu finden, welches Modul vor den anderen gebaut werden müssen. Wenn es keine Abhängigkeiten gibt, dann wird es die Liste der Module nehmen, wie sie in der übergeordneten pom.xml definiert sind.

In diesem Fall, wenn Sie einen Befehl auf dem Root-Projekt ausführen, wird Maven2 gebaut zunächst das Stammprojekt, und dann der Untermodule. Sie kann nicht überspringen die Erstellung des Stammprojekt.


Bearbeiten, dank RichSeller Kommentar

Eine vollständige Erklärung der Unterschiede zwischen mehreren Modulen (Aggregation Projekt) und Vererbung (übergeordnetes Projekt) im Maven Buch zu finden, hier .

Andere Tipps

Sie können die übergeordnete Build nicht überspringen, aber Sie können das Profil konfigurieren nicht mit einem kleinen Hack aktiviert werden. Diese Antwort zeigt, wie die Aktivierung eines Profils zu steuern, indem das Vorhandensein oder Fehlen eines dateibasierten <activation> Element. Auf diese Weise können Sie das Profil in den übergeordneten definieren, sondern haben es wegen der Marker-Datei in diesem Projekt deaktiviert ist, in den Eltern. Kinder Projekte würden nicht die Marker-Datei in ihrer Quelle haben, so dass das Profil würde für diese Projekte aktiviert werden.

Update zu klären: Auf meinem Testprojekt bedeutet diese Konfiguration des Profil in dem übergeordneten Projekt deaktiviert (die die Datei in src / main / resources hat), aber in allen untergeordneten Projekten aktiviert, die die Datei nicht in ihren Ressourcen Verzeichnisse.

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

Ich will dokumentieren, dass es teilweise Kompromiss zu meiner Situation (dank Jungs auf Maven Benutzer-Mailingliste für Vorschlag). Grundsätzlich müssen Sie Profil in zwei Stücke hacken. Wiederverwendbare configuration Abschnitt Plugin geht an die Eltern POM, und executions bleibt im Kind POM. Dann wird die Profil-Plugin in dem Kind als inherited und voila markiert - zur Laufzeit übergeordnetes Profil wird nicht ausgeführt, da es executions Abschnitt fehlt. Dies ist bei weitem nicht ideal, aber es funktioniert. Siehe zu diesem Link zum Beispiel

war ich nicht in der Lage „fehlende“ Datei-Lösung zu implementieren, wie durch Rick Verkäufer oben zur Verfügung gestellt. Es scheint, dass einmal eingestellte aktiv / nicht-aktiver Zustand des Profils wird nicht einmal die Marker-Datei geändert werden soll, aus dem Modul fehlt (s). Aber hier ist die genaue Lösung für mein Problem. Achtung: Dies ist nur verfügbar, beginnend mit Maven 2.1 +

Wenn ich einen Elternteil POM mit 2 Modulen definiert habe: foo und boo dann in regelmäßigen Umständen Reihenfolge der Ausführung wird:

  1. Eltern
  2. foo
  3. boo

Alles, was ich tun müssen, um übergeordneten Build überspringen ist, diese Befehlszeilenoption hinzufügen

mvn install –rf foo

Alternativ können Sie --resume-from verwenden Was wird es tun, ist Eltern zu überspringen und von foo Modul nach unten fortsetzen. Nun - ich untersuchen, ob dies durch die Konfiguration Reactor-Plugin erreicht werden kann, (P. S - Nr. Kann es nicht) , aber auch mit dem Schalter, das obige Szenario funktioniert gut für mich

Dies wird implizit @ romaintaz Antwort auf die gleiche Frage, Maven - überspringen geordnete Projekt build

aber nur dies explizit zu machen, in der Mutter pom es ist zwingend notwendig, dass Sie das Verpackungselement als pom spezifizieren (und nicht jar oder Krieg).
Beispiel:

<packaging>pom</packaging>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top