2013-07-05 17 views
10

Wir haben eine große und tiefe Modulstruktur mit drei "echten" Schichten der Vererbung und drei bis vier Schichten der Modulaggregation.Maven Modul Vererbung vs Aggregation

Mir geht es gut mit der echten Erbschaft: eine unternehmensweite Super-Pom, ein Produkt-weite Elternteil und ein kundenweiter Elternteil für Anpassungen des Produkts.

Aber ich beobachte, dass auch die "leeren" Aggregationsmodule als Eltern ihrer Submodule definiert sind.

Wenn das gesamte Konzept das gleiche wie in OO ist, macht dies für mich keinen Sinn, wenn die Aggregationsmodule (sie sind neben ihren Submodulen leer) dem Pom keine spezifische Konfiguration hinzufügen.

Gibt es einen anderen Grund (vielleicht in Betrieb), warum dies nützlich sein könnte?

Nebenbemerkung: Die Einführung in die Pom ist in dieser Hinsicht nicht klar: Begriff "Eltern" ist nicht klar: es kann Super-Pom (= Eltern im Vererbungsbaum) oder Aggregation Pom (= Eltern im Dateisystem ...)

+0

Dies beantwortet nicht Ihre Frage, aber wenn Sie Aggregation von Vererbung getrennt haben (was ich auch dazu tendiere), warum erben Sie von Ihren Aggregator Poms? In den Poms, die aggregiert werden, geben Sie keinen Abschnitt an oder erben Sie von Ihrem echten Elternteil. Grundsätzlich sind _ "leere" Aggregationsmodule als Eltern ihrer Submodule definiert_ nicht zwingend erforderlich. tue es nicht, wenn es keinen Sinn macht – Hilikus

Antwort

12

Es gibt ein großes Problem bei der Definition dieser Konzepte in der Maven-Community. Sie haben Recht mit der Aussage, dass ein Eltern-Pom ist Vererbung und Modul-POM ist Zusammensetzung. Aber leider hat die Trennung dieser beiden Konzepte keine Geschichte in Maven. Die Maven-Dokumentation sagt klar, dass es besser ist, sie zu trennen. Dies würde zu dieser idealen Struktur führen

app-api/ 
app-impl/ 
app-war/ 
app-parent/ 
pom.xml 

Wo pom.xml ist das Modul pom.

Aber fast jedes Projekt, das Sie im Open-Source-Sektor sehen werden, unterscheidet nicht zwischen ihnen.

Dies hat einen Grund: Viele Plugins unterscheiden zwischen ihnen auch nicht. Und selbst Maven selbst nimmt eine andere Einstellung an: Wenn <relativePath> nicht gesetzt ist, nimmt Maven an, dass der Elternteil sich bei .. befindet. Jedes Projekt muss also auf <relativePath>../app-parent</relativePath> als Eltern verweisen.

Das beliebteste Plugin, das große Probleme mit der erwähnten Struktur hat, ist das Maven-Release-Plugin! Sie werden seltsame Probleme haben, wenn Sie der Annahme nicht folgen, dass der Modul-Pom der Eltern-Pom ist.

Der schlimmste Fehler ist, dass das release-plugin die Version-Eigenschaften in Ihrem Eltern nicht ersetzen kann und aufgrund von SNAPSHOT-Abhängigkeiten fehlschlägt. Ihr Elternteil wird vielleicht so etwas enthalten.

Normalerweise beim Freigeben dieser Eigenschaften würde automatisch auf ihre Release-Versionen 1.1 und 1.2 gesetzt werden. Das release-plugin (getestet bis Version 2.2.2) scheitert jedoch mit der Meldung, dass das Modul nicht mit Snapshot-Abhängigkeiten freigegeben werden kann.

Wenn Sie nur einige Modul-Poms "überspringen", ist dies möglicherweise kein Problem, wenn Sie <relativePath> korrekt definieren. Aber Sie müssen versuchen, einige Fehler in Maven Plugins zu erwarten. Neben diesen Bugs hast du völlig Recht, die Poms zu trennen und ich würde es versuchen, wenn du Zeit hast, eine Sandbox-Veröffentlichung zu machen.

+2

Eine andere Möglichkeit, dies zu rechtfertigen, ist, dass dies "Trennung von Sorgen" ermöglicht. Durch die Trennung von Vererbung und Aggression können beide flexibler sein. –

0

Die Vererbung eines Eltern-Pom ist nützlich, wenn Sie Eigenschaften haben, die für mehrere Projekte gültig sind.Von dem, was ich verstanden habe, hast du diesen Teil schon richtig gemacht ;-)

Was du Aggregationsmodule nennst, hat auch einen gültigen praktischen Nutzen. Sie können mehrere Submodule zu einem einzigen Pom gruppieren. Wenn Sie Ihr Projekt erstellen möchten, möchten Sie meist nicht jedes Modul einzeln erstellen, sondern sie in einer einzigen Anwendung zusammenführen. Dies kann durch einen solchen Pom erfolgen, der alle Submodule als solche referenziert. Es kann nicht nur mit dem Konzept eines Eltern-Pom gemacht werden, da es nichts von den anderen Modulen weiß.

0

Die kurze Antwort IIUC ist, Sie erben nicht von Ihren Aggregation-only Poms. Sie tun, wenn Ihr Aggregator der gleiche wie Ihr Elternteil ist, wie in der kanonischen Mavenstruktur. Aber wenn Sie Aggregator von Parent trennen, erben Sie nicht vom Aggregator