2010-05-12 15 views
5

Dla celów edukacyjnych I utworzyły układ projektu jak tak (płaski w celu swoich zaćmienie lepiej):Maven - projekt "wszystko" lub "rodzic" do agregacji?

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

nadrzędna zawiera łączny projekt z rdzeniem, zrezygnować i wszystko. Core implementuje obowiązkową część aplikacji. Opt jest częścią opcjonalną. Wszystko powinno łączyć rdzeń z opcją, a te dwa moduły są wymienione jako zależności.

Jestem teraz próbuje wprowadzić następujące artefakty:

  1. z produktem core.jar
  2. produkt-core-src.jar
  3. produkt-core-z-dependencies.jar
  4. product-opt.jar
  5. product-opt-src.jar
  6. product-opt-z-dependencies.jar
  7. product-all.jar
  8. produkt-all-src.jar
  9. product-wszystko-z-dependencies.jar

Większość z nich są dość proste do wykonania. Mam jednak pewien problem z artefaktami agregującymi. Udało mi się zrobić produkt-all-src.jar z niestandardowym deskryptorem zespołu w module "all", który pobiera źródła dla wszystkich nieprzechodniowych depów, i to działa dobrze. Technika ta pozwala mi również na tworzenie produktu all-with-dependencies.jar.

Jednak niedawno odkryłem, że można użyć źródła: celu agregującego w źródłowej wtyczce do agregowania źródeł całego zagregowanego projektu. Dotyczy to również wtyczki javadoc, która również agreguje przy użyciu projektu nadrzędnego.

Tak więc jestem rozdarty między moim podejściem do "wszystkich" modułów i porzuceniem modułu "wszystkie" i po prostu używam modułu "nadrzędny" dla wszystkich agregacji. Czuje się nieczyste, aby niektóre artefakty zebrane w "rodzic", a inne produkowane w "wszystkich". Czy istnieje sposób tworzenia słoja "produkt-wszystko" w projekcie nadrzędnym lub agregowania javadoc w projekcie "wszystkie"? A może powinienem zachować oba?

Dzięki

Odpowiedz

5

Spłaszczone drzewa nie są już często używane. Dokonano tego kilka lat temu, aby poradzić sobie z tym, jak Eclipse radził sobie z projektami i brakiem dobrej integracji Maven i Eclipse. Jeśli użyjesz m2eclipse do importowania projektów Maven do Eclipse, nie będziesz miał żadnych problemów z typowym dla maven drzewem.

Co jest dobrym przykładem na to, jak zbudować kompilację Mavena? Źródło projektu Maven itself. Ma wszystkie pożądane elementy, łącznie z ostatecznym assembly, który pakuje pakiety.

Typowa struktura zagnieżdżona ma hierarchiczną hierarchię, w której rodzic wykonuje agregację modułów znajdujących się pod nią, a dzieci dziedziczą wartości od rodzica. Chociaż mogą one, a czasami są odrębne, nie jest to normą.

+0

Dzięki za cynk. Właśnie obejrzałem to i wygląda na to, że źródło maven podąża za ogólnym układem, który zasugerowałem, jednak bez spłaszczania drzewa, jak wskazałeś. Końcowy skład jest niezbyt czysty, po prostu robi wyrażeń regularnych grep dla wszystkich plików źródłowych w katalogu "../", nie jest łatwy, jeśli chcesz źródła z zależności 3: rd party itd. Również nie jest zgodny z tym, w jaki sposób javadoc praca agregatora (za pośrednictwem projektu nadrzędnego). Wygląda na to, że brakuje mi funkcjonalności, spróbuję zapisać alternatywne podejście tutaj, kiedy eksperymentowałem z niektórymi. Dzięki za wskaźnik. –

+0

BTW, zespół src można znaleźć pod adresem http://svn.apache.org/repos/asf/maven/maven-3/trunk/apache-maven/src/main/assembly/src.xml –

0

Sugeruję tylko utrzymanie deskryptor montażową z „all”, przenieść go do rodzica/i zmienić Rodzic/pom.xml odpowiednio, a następnie utworzyć ten zespół wykonując coś jak mvn -f parent/pom.xml assembly:assembly. Innymi słowy, tak, usuń nadmiarowy projekt dla "wszystkich", ponieważ jest to po prostu powielanie tego, co "rodzic" już robi.

Na marginesie "rodzic" wydaje się być marnym wyborem nazwy dla tego projektu, jeśli jest to projekt zbiorczy, a nie tylko nadrzędny plik pom.xml.

[Edytuj]

Chociaż znacznie większy projekt, być może projekt, który jest określone jak jesteś Przewidując jest projekt apache wielbłąd. Sprawdź to tutaj: http://camel.apache.org/source.html. Istnieje nadrzędny/moduł, który obsługuje wszystkie dla wszystkich pozostałych, oraz osobny moduł do tworzenia rzeczywistych rozkładów kompilacji w apache-camel/(z deskryptorami zespołu w apache-camel/src // main/descriptors). Być może to będzie bardziej pomocna.

+0

Sugerujesz, że powinienem mieć jednego rodzica, z tylko rodzicem pom i jeden "agregat", który buduje kompletny produkt? Czy powinieneś umieścić "dependencyManagement" w rodzicu lub w zbiorach? Czy możesz zaproponować dobry przykładowy projekt? –

+0

Zasadniczo tak. Jeśli twój "agregat" nic nie robi, niż wywołanie deskryptora zespołu, nie ma potrzeby posiadania go w osobnym module. To może po prostu żyć z pom na najwyższym poziomie (prawdopodobnie nie z rodzicem, jak zasugerowałem po raz pierwszy). i powinny mieszkać z nadrzędną pom. Jeśli masz dużo złożonej agregacji (powiedzmy ... indywidualną kompilację dla systemu Windows, Linux i OSX), to te agregaty powinny być w osobnych modułach. W twoim przypadku brzmiało to tak, jakby zrobił to zwykły zespół. – whaley

+0

Przepraszamy za przeciągnięcie tego, ale jak utworzyć kompletny słoik dla projektu zbiorczego? Nie potrafię wymyślić, jak to zrobić bez tworzenia "całego" projektu. –

Powiązane problemy