Moduły Maven + Budowanie pojedynczego konkretnego modułu

383

Mam multi-module projektu Maven z projektem dominującej Poraz trzech sub-modułów A, Boraz C. Zarówno Bi Cto projekty wojennych i oba zależą A.

Mogę wpisać mvn compilew Pi 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 Bkatalogu, 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?

  1. Czy muszę biegać mvn packagedla całej hierarchii projektu, kiedy naprawdę chcę B?

  2. 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 Ajest nadal w fazie aktywnego rozwoju.

Jakieś najlepsze praktyki tutaj?

Brian Ferris
źródło
możliwy duplikat Maven i zależnych modułów
oberlies

Odpowiedzi:

694

Jakieś najlepsze praktyki tutaj?

Użyj zaawansowanych opcji reaktora Maven , a dokładniej:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Więc po prostu cddo nadrzędnego katalogu P i uruchom:

mvn install -pl B -am

I to zbuduje B i moduły wymagane przez B.

Pamiętaj, że musisz użyć dwukropka, jeśli odwołujesz się do innego artifactIdniż nazwa katalogu:

mvn install -pl :B -am

Jak opisano tutaj: https://stackoverflow.com/a/26439938/480894

Pascal Thivent
źródło
15
Dla każdego, kto wejdzie na tę stronę w 2011 roku, jest to lepsza odpowiedź. Teraz jest lepsze wsparcie dla wielu modułów w samym maven (Maven 2.1 i wyżej), nie musisz używać wtyczki reaktora.
Spedge
17
Inną bardzo przydatną opcją jest „-amd, - także-make-dependents”, która buduje wszystkie moduły zależne od projektów na liście reaktorów.
deterb
1
Co z budowaniem modułu wnuka?
Bax,
12
@Bax, użyj mvn install -pl .,parent/child,parent/child/grandchild Użyj przecinka, aby oddzielić wiele projektów i. dla rodzica pom
Neo
1
Kiedy próbuję clean packagetak skonfigurować moduł, nie może on rozwiązać zależności reaktora, które nie zostały jeszcze zainstalowane. Dzięki -amtemu niepotrzebnie odbuduje deps.
dorzecze
18

Powiedzmy nadrzędna pom.xml zawiera 6 modułów i chcesz uruchomić A , B i F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd do projektu nadrzędnego

 mvn --projects A,B,F --also-make clean install

LUB

mvn -pl A,B,F -am clean install

LUB

mvn -pl A,B,F -amd clean install

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.

Waqas Ahmed
źródło
8

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 installw 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 installw projekcie nadrzędnym, jeśli zaktualizowałeś część kodu.

Wiktor Hugo
źródło
3
Byłby to koszmar podczas projektowania, obraz, który po poprawce w module podrzędnym będzie musiał ją zainstalować, a następnie uruchomić kontener serwletu. Życie jest krótkie :(
hguser
7

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.

Bogaty sprzedawca
źródło
1
Czy istnieje prosty sposób zagwarantowania, że ​​wszystkie zależne projekty dla mojego projektu docelowego zostały zainstalowane? Hierarchia, którą mam, jest w rzeczywistości znacznie bardziej złożona niż ta tutaj opisana, więc spróbuj zapamiętać, czy uruchomiłem instalację mvn dla każdego zależnego projektu od czasu ostatniej zmiany kodu może być trudne.
Brian Ferris,
Tak, używając modułów do zbudowania zestawu projektów, zobacz link dodany do oryginalnej odpowiedzi.
Bogaty sprzedawca,
5

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.

deterb
źródło
3
To była właściwa odpowiedź, ale w Maven 2.1 nie musisz już używać wtyczki reaktora. Spójrz na odpowiedź Pascala w tym wątku na temat „Zaawansowane opcje reaktora”
Spedge
3

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 -amlub -plpoleceń zgodnie z opisem w zaakceptowanej odpowiedzi. Jeśli używasz wersji maven sprzed wersji 2.1, zmień ją najpierw :)

Zac Thompson
źródło
Grmphh ... to skończę z tyloma projektami agregującymi co projektami.
Kris,
@Kris Nie polecałbym tego dłużej. Zostawię to tutaj, na wypadek, gdyby ktoś nadal chciał wiedzieć, ale zawsze używam teraz flag -am i -pl. Zaktualizowałem swoją odpowiedź.
Zac Thompson,