2010-09-07 21 views
6

Mój projekt składa się z 5 podprojektów. Jedna to Wojna, a pozostałe 4 to słoiki. Zasadniczo projekt wojenny wymaga wszystkich 4 projektów słoików i ich zależności.Jak radzić sobie z zależnościami sub projektów w Maven

Mogę rozebrać zależności, aby mieć coś takiego jak wojna-> A-> B-> C-> D. Każdy podprojekt dodaje swój udział w zewnętrznych zależnościach (wiosna, rozpórki, hibernacja), aby w końcu wojna dostała wszystko, co potrzebne do uruchomienia.

To wygląda całkiem dobrze zorganizowane i kwadratowe, ale zadaję sobie pytanie, czy jest to bardzo praktyczne, aby wprowadzić zmiany.

Wyobraź sobie, że muszę zmienić jeden wiersz kodu w projekcie D, nie zmieniając niczego w zależnościach Mavena. Musiałbym oczywiście ponownie wydać projekt D, ale muszę ponownie opublikować projekty C, B, A i wojnę, aby odzwierciedlić tę zmianę w swoich plikach pom. Może to być długie i denerwujące, zwłaszcza jeśli musisz szybko wydać nową wersję, aby naprawić coś w produkcji.

Mogę sprawić, że wojna będzie zależała od wszystkich 4 projektów, więc muszę zmienić numer wersji projektu D w pliku wojny wojennej. Ale potem mam projekt A pośrednio zależny od projektu D 1.0 i wojny określającej projekt D 1.1. Sądzę, że zależność od wojny bezpośredniej wygrałaby w takim razie, nieprawdaż?

To spowodowałoby, że nowa wersja wojenna zostanie wydana szybciej, ale zepsułaby również zależności między projektami podrzędnymi, ponieważ byłyby one nieaktualne.

Jaki byłby dopuszczalny sposób poradzenia sobie z taką sytuacją?

Odpowiedz

3

Nie ma prostej odpowiedzi na swój problem.

Jeśli rzeczywiście masz łańcuch zależności przechodnich (A-> B-> C-> D), to niezależne zwolnienie wszystkich modułów w łańcuchu nie jest złą opcją, chociaż jest żmudne. duża szansa, że ​​zagnieżdżone zależności są prostymi libami i nie zobaczą zbyt często zmian.Mam nadzieję, że nie będziesz zmuszony do częstego przechodzenia przez ten proces.Podaj, że będzie to taka sama sytuacja, jak gdyby log4j był aktualizowany i cały twój moduł Les musiał być również zaktualizowany.

Kolejną rzeczą, którą należy wziąć pod uwagę, są zależności między WO. Tak, Maven automatycznie pobiera dla ciebie zależności, ale często dobrym zwyczajem jest jawne deklarowanie swoich znanych zależności, więc możesz określić numer wersji dla każdego modułu. Oznaczałoby to, że A zależy bezpośrednio od D i innych. Niestety, jeśli masz sprzeczne numery wersji, jak już opisałeś, to szukasz kłopotów w swojej ścieżce klas. Jeśli naprawdę trzeba to zrobić jednak, Maven nie pozwala wykluczyć zależności przechodnie wyraźnie:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-B</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-C</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-C</artifactId> 
     <version>1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>my.project</groupId> 
      <artifactId>module-D</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>module-D</artifactId> 
     <version>1.0</version> 
    </dependency> 
    </dependencies> 
    ... 
</project> 

Oto documentation opisując te opcjonalne zależności i wykluczenia.

Czy konieczne jest niezależne wydawanie B, C i D? Jeśli nie, rozważ użycie pliku pom.xml Aggregator w katalogu głównym swoich modułów. Umożliwi ci to używanie wersji SNAPSHOT w swoich modułach, a następnie zwolni grupę naraz.W ten sposób nasz zespół zarządza naszym projektem wielomodułowym. Korzystanie z zależności SNAPSHOT zapewnia korzystanie z wersji, która została JUST zbudowany, gdy te artefakty są potrzebne.

+0

cześć Gweebz. Dziękuję za szczegółową odpowiedź. Nie muszę oddzielnie publikować każdego projektu podrzędnego, więc dobrze przyjrzę się tej koncepcji agregatora, o której nie wiedziałem. Moduły zawierają cały kod biznesowy i danych i są zobowiązane do regularnej zmiany. Innym rozwiązaniem byłoby wykluczyć zależności tranzytowe, jak powiedziałeś, nie myślałem o tym. Dzięki za światło w tej sprawie. – IceGras

+0

Bez wymogu niezależnego wydawania każdego modułu, zdecydowanie sugeruję użycie rozwiązania Aggregator. Jego wzór idealnie pasuje do Twojego scenariusza. Cieszę się, że mogłem pomóc :) –

1

Czy faktycznie wypuszczasz dowolne projekty od A do D niezależnie, bez WAR? Jeśli nie, nie widzę problemów z bieżącą konfiguracją. Powinieneś absolutnie użyć tej samej wersji dowolnego modułu w całym projekcie. W przeciwnym razie po otwarciu drzwi do classloader hell - proszę mi wierzyć, że nie chcesz się tam dostać :-(

Aby komunikaty prostsze, maven-release-plugin może pomóc

+0

Witam Pétera. Projekty od A do D są specyficzne dla WAR, ale muszę je wydać indywidualnie, aby inni programiści mogli zbudować plugin WAR i Maven znajdujący zależności. Może te wydania nie są konieczne? – IceGras

+0

@IceGras, podbijanie numeru wersji za każdym razem, gdy dokonasz zmiany, może być naprawdę przesadzone. W naszym projekcie jesteśmy zadowoleni z wersji SNAPSHOT podczas programowania i tworzymy nową wersję tylko dla oficjalnego wydania (kandydata). –

+0

Praca z migawkami w czasie programowania wydaje się najlepszym rozwiązaniem, ale wtedy mam takie pytanie: Jeśli wydasz RC1 ze wszystkimi modułami w wersji 1.0, a potrzebujesz tylko zmienić moduł C. Jeśli zwolnisz RC2, wszystkie pozostałe projekty będą się zwiększać wersja bez niczego? Moją główną troską jest zmiana produkcji. Jeśli moje wydanie musi zostać zmienione, będę musiała podważyć wszystkie numery wersji, aby przejściowo odzwierciedlić zmianę. – IceGras

1

Najlepszą odpowiedzią w dzisiejszych czasach jest użycie gradle, które jest najlepsze dla mrówek i mavenów. Nigdy nie lubiłem mavenów, ale gradle wziął wiele wspólnych pojęć, ale sprawił, że był bardziej podobny do mrówki, ponieważ jest elastyczny, więc nie ma łatwej odpowiedzi na twoje pytanie w gradle;).

Powiązane problemy