2010-05-12 3 views
5

Für Ausbildungszwecke Ich habe ein Projekt-Layout wie so (flach, um einen besseres Hotel Eclipse) einzurichten:Maven - 'all' oder 'Eltern' Projekt für die Aggregation?

-product 
| 
|-parent 
|-core 
|-opt 
|-all 

Elternteil enthält ein Aggregat Projekt mit Kern, entscheiden und alles. Core implementiert den obligatorischen Teil der Anwendung. Opt ist ein optionaler Teil. Alles soll core mit opt ​​kombinieren und hat diese beiden Module als Abhängigkeiten aufgelistet.

ich jetzt versuchen, die folgenden Artefakte zu machen:

  1. Produkt-core.jar
  2. Produkt-Core-src.jar
  3. Produkt-Kern-mit-dependencies.jar
  4. Produkt-opt.jar
  5. Produkt-Opt-src.jar
  6. Produkt-Opt-mit-dependencies.jar
  7. Produkt-all.jar
  8. Produkt-all-src.jar
  9. Produkt-all-mit-dependencies.jar

Die meisten von ihnen relativ einfach herzustellen sind. Ich habe jedoch ein Problem mit den aggregierenden Artefakten. Ich habe es geschafft, die Produkt-all-src.jar mit einem benutzerdefinierten Assembly-Deskriptor in dem Modul "all" zu erstellen, das die Quellen für alle nicht-transitiven Deps herunterlädt, und das funktioniert gut. Diese Technik erlaubt mir auch, das Produkt all-with-dependencies.jar zu erstellen.

Ich habe jedoch kürzlich herausgefunden, dass Sie das source: aggregierte Ziel im Quell-Plugin verwenden können, um Quellen des gesamten aggregierten Projekts zu aggregieren. Dies gilt auch für das Javadoc-Plugin, das auch durch die Verwendung des übergeordneten Projekts aggregiert.

Also bin ich hin- und hergerissen zwischen meinem 'all' Modulansatz und dem 'all' Modul und benutze einfach das 'elterliche' Modul für die gesamte Aggregation. Es fühlt sich unrein an, dass einige aggregierte Artefakte in "Eltern" erzeugt werden und andere in "Alle" produziert werden. Gibt es eine Möglichkeit, ein Produkt-All-Jar im übergeordneten Projekt zu erstellen oder Javadoc im All-Projekt zu aggregieren? Oder sollte ich beide behalten?

Dank

Antwort

5

Abgeflachte Bäume werden nicht mehr oft verwendet. Dies wurde vor einigen Jahren gemacht, um sich damit auseinander zu setzen, wie Eclipse Projekte gehandhabt hat und das Fehlen einer guten Integration von Maven und Eclipse. Wenn Sie mit m2eclipse Maven-Projekte in Eclipse importieren, haben Sie keine Probleme mit einem maven-typischen verschachtelten Baum.

Was ist ein gutes Beispiel für die Struktur eines Maven Builds? Das Maven-Projekt Quelle itself. Es hat alle Teile, die Sie wünschen, einschließlich der endgültigen assembly, die Pakete bündelt.

Die typische verschachtelte Struktur hat eine Hierarchie von oben nach unten, wobei das übergeordnete Element die Aggregation der darunter liegenden Module durchführt und die untergeordneten Elemente Werte vom übergeordneten Element erben. Obwohl diese manchmal getrennt sein können, ist dies nicht die Norm.

+0

Danke für den Tipp. Ich habe es mir nur angeschaut und es scheint so, als ob die Quelle der Maven dem allgemeinen Layout folgt, das ich vorgeschlagen habe, jedoch ohne den Baum zu verflachen, wie Sie darauf hingewiesen haben. Die letzte Assembly ist IMO nicht sehr sauber, es tut nur eine regex grep für alle Quelldateien im '../' Verzeichnis, nicht einfach, wenn Sie Quellen von 3rd Party-Abhängigkeiten usw. wollen. Auch nicht im Einklang mit dem Javadoc Aggregator-Arbeit (über das Elternprojekt). Es scheint, dass die Funktionalität, die ich gerne hätte, fehlt, ich werde versuchen, hier einen alternativen Ansatz aufzuschreiben, wenn ich etwas experimentiert habe. Danke für den Zeiger. –

+0

BTW, die src-Assembly finden Sie unter http://svn.apache.org/repos/asf/maven/maven-3/trunk/apache-maven/src/main/assembly/src.xml –

0

ich die Montage nur Beschreiber von „all“ halten würde vorschlagen, sie zu Eltern bewegen/und Eltern/pom.xml entsprechend ändern, und erstellen Sie dann die Montage durch so etwas wie mvn -f parent/pom.xml assembly:assembly tun. Mit anderen Worten, ja, entferne das redundante Projekt für "alle", da es nur dupliziert, was "Eltern" bereits macht.

Nebenbei bemerkt scheint "Eltern" wie eine schlechte Namenswahl für dieses Projekt, wenn es ein Aggregat-Projekt und nicht nur ein Elternteil pom.xml ist.

[Bearbeiten]

Obwohl ein viel größeres Projekt, vielleicht ein Projekt, das aus gelegt ist, wie Sie Fragen an dem Apache-Kamel-Projekt ist. Schau es dir hier an: http://camel.apache.org/source.html. Es gibt ein Elternteil/Modul, das alles für alles andere handhabt, und ein separates Modul zum Erzeugen der tatsächlichen Build-Verteilungen in apache-camel/(mit Assemblydeskriptoren in apache-camel/src // main/descriptors). Vielleicht wird das eine größere Hilfe sein.

+0

schlagen Sie vor, dass ich einen Elternteil mit nur einem Elternteil und ein "Aggregat" haben sollte, das das komplette Produkt bildet? Sollten Sie 'dependencyManagement' in übergeordnete oder aggregierte Daten setzen? Können Sie ein gutes Beispielprojekt vorschlagen? –

+0

Im Wesentlichen ja. Wenn Ihr "Aggregat" nichts anderes tut, als einen Assembly-Deskriptor aufzurufen, ist es nicht notwendig, es in einem separaten Modul zu haben. Das kann nur mit dem Top-Level-Pom leben (wahrscheinlich nicht mit dem Elternteil, wie ich zuerst vorgeschlagen habe). und sollten mit dem übergeordneten Pom leben. Wenn Sie viele komplexe Aggregation haben (sagen wir ... eine individuelle Build für Windows, Linux und OSX), dann sollten diese Aggregate in einzelnen Modulen sein. In deinem Fall klang es so, als ob nur eine einfache Versammlung es tun würde. – whaley

+0

Entschuldigen Sie, dass Sie das hier herausgezogen haben, aber wie machen Sie ein komplettes Glas für ein Gesamtprojekt? Ich kann nicht herausfinden, wie das geht, ohne ein "All" -Projekt zu erstellen. –

Verwandte Themen