Mam multi-module projektu Maven z projektem dominującej P
oraz trzech sub-modułów A
, B
oraz C
. Zarówno B
i C
to projekty wojennych i oba zależą A
.
Mogę wpisać mvn compile
w P
i mieć wszystkich podmodułów prawidłowo skompilowany. Problem pojawia się, gdy chcę wykonać operacje dla określonych modułów.
Chciałbym móc spakować wojnę dla projektu B
, ale kiedy uruchamiam komendę package z B
katalogu, narzeka, że nie może znaleźć zależności A
.
Rozumiem z tego pytania: Maven i moduły zależne, że być może Maven nie jest tak naprawdę zaprojektowany do tego rodzaju rozwiązywania zależności, ale to nasuwa pytanie, jak mam go spakować B
?
Czy muszę biegać
mvn package
dla całej hierarchii projektu, kiedy naprawdę chcęB
?Czy muszę instalować migawki A w moim lokalnym repozytorium za każdym razem, gdy chcę spakować
B
?
Ten drugi scenariusz nie sprawia wiele radości, gdy A
jest nadal w fazie aktywnego rozwoju.
Jakieś najlepsze praktyki tutaj?
źródło
Odpowiedzi:
Użyj zaawansowanych opcji reaktora Maven , a dokładniej:
Więc po prostu
cd
do nadrzędnego katalogu P i uruchom:I to zbuduje B i moduły wymagane przez B.
Pamiętaj, że musisz użyć dwukropka, jeśli odwołujesz się do innego
artifactId
niż nazwa katalogu:Jak opisano tutaj: https://stackoverflow.com/a/26439938/480894
źródło
mvn install -pl .,parent/child,parent/child/grandchild
Użyj przecinka, aby oddzielić wiele projektów i. dla rodzica pomclean package
tak skonfigurować moduł, nie może on rozwiązać zależności reaktora, które nie zostały jeszcze zainstalowane. Dzięki-am
temu niepotrzebnie odbuduje deps.Powiedzmy nadrzędna pom.xml zawiera 6 modułów i chcesz uruchomić A , B i F .
1- cd do projektu nadrzędnego
LUB
LUB
Uwaga: Po określeniu projektu za pomocą opcji -am , Maven zbuduje wszystkie projekty, od których zależy określony projekt (bezpośrednio lub pośrednio). Maven zbada listę projektów i przejdzie przez drzewo zależności, znajdując wszystkie projekty, które musi zbudować.
Podczas gdy polecenie -am powoduje, że wszystkie projekty wymagane przez dany projekt w kompilacji wielomodułowej , opcja -amd lub --also-make-dependents konfiguruje Maven do budowania projektu i każdego projektu zależnego od tego projektu. Korzystając z opcji -also-make-dependents , Maven zbada wszystkie projekty w naszym reaktorze, aby znaleźć projekty zależne od konkretnego projektu. Automatycznie zbuduje te projekty i nic więcej.
źródło
Maven absolutnie został zaprojektowany dla tego rodzaju zależności.
mvn package
nie zainstaluje niczego w lokalnym repozytorium, po prostu pakuje projekt i pozostawia go w folderze docelowym.Wykonaj
mvn install
w projekcie nadrzędnym (A), dzięki temu wszystkie podmoduły zostaną zainstalowane w repozytorium Maven komputera, jeśli nie będzie żadnych zmian, wystarczy skompilować / spakować podmoduł (B), a Maven zajmie już zapakowane i zainstalowane zależności w sam raz.Musisz tylko
mvn install
w projekcie nadrzędnym, jeśli zaktualizowałeś część kodu.źródło
Jeśli wcześniej uruchomiłeś mvn install w projekcie B, zostanie on zainstalowany w lokalnym repozytorium, więc podczas budowania pakietu A Maven może rozwiązać tę zależność. Tak długo, jak instalujesz projekt B za każdym razem, gdy go zmieniasz, twoje kompilacje dla projektu A będą aktualne.
Możesz zdefiniować projekt wielomodułowy z agregatorem pom, aby zbudować zestaw projektów.
Warto również wspomnieć o m2eclipse , integruje on Maven z Eclipse i umożliwia (opcjonalnie) rozwiązywanie zależności z obszaru roboczego. Więc jeśli hackujesz wiele projektów, zawartość obszaru roboczego zostanie wykorzystana do kompilacji. Gdy będziesz zadowolony ze swoich zmian, uruchom mvn install (na każdym projekcie z kolei lub za pomocą agregatora), aby umieścić je w lokalnym repozytorium.
źródło
Spójrz na moją odpowiedź Maven i moduły zależne .
Plugin Maven Reaktor jest przeznaczony do czynienia z budową część projektu.
Konkretny cel, którego chcesz użyć
reactor:make
.źródło
Mówisz, że „naprawdę chcesz tylko B”, ale to nieprawda. Chcesz B, ale chcesz także zaktualizować A, jeśli nastąpiły w nim jakieś zmiany („aktywny rozwój”).
Czasami więc chcesz pracować z A, B i C. W tym przypadku masz projekt agregatora P. W przypadku, gdy chcesz pracować z A i B (ale nie chcesz C), powinieneś utworzyć projekt agregatora Q .
Edytuj 2016 : Powyższe informacje były prawdopodobnie istotne w 2009 r. Od 2016 r. Zdecydowanie zalecam zignorowanie tego w większości przypadków i po prostu użycie flag wiersza polecenia
-am
lub-pl
poleceń zgodnie z opisem w zaakceptowanej odpowiedzi. Jeśli używasz wersji maven sprzed wersji 2.1, zmień ją najpierw :)źródło