Maven – projekt z wieloma modułami

Apetyt rośnie w miarę jedzenia, kiedy projekt zaczyna przybierać w rozmiarach warto zastanowić się nad wydzieleniem modułów Mavena. Jeśli rozpoczynając projekt wiemy, że nie będzie mały, moduły dobrze jest wydzielić do razu. Moduły w Mavenie organizują projekt w logicznie powiązane części. Dzięki temu struktura jest przejrzysta, a kod łatwiejszy w utrzymaniu.

Założenia

Większość aplikacji wykorzystuje bazy danych. Taki kod jest idealny do wydzielenia w oddzielnym module. Ma jedną, konkretną odpowiedzialność – komunikację z bazą danych.

Tworzenie modułów w Mavenie – rodzic i dzieci

Do projektu posiadającego jeden moduł dla przykładu dodam maven-modules-dao odpowiedzialny za komunikację z bazą danych oraz maven-modules-web jako podstawę aplikacji webowej.

Moduły można dodawać na kilka sposobów. Ja najczęściej wybieram ten, który oferuje IDE. Korzystając ze środowiska IntelliJ IDEA po kliknięciu prawym przyciskiem myszy na nazwie modułu w eksploratorze wybieramy New -> Module.

Moduły w Mavenie - nowy moduł

Następnie wybieramy na podstawie jakiego archetypu powinien zostać utworzony moduł. Na kolejnym ekranie nadajemy artifactId, czyli w moim przypadku maven-modules-dao oraz maven-modules-web. Rodzicem dla tworzonego modułu jest domyślnie moduł który wybraliśmy na początku w eksploratorze.

W pom.xml rodzica zmienił się sposób pakowania – teraz ma wartość pom. Oznacza to, że ten pom.xml będzie grupował inne moduły, w tym przypadku będzie rodzicem. Podczas budowania nie stworzy wynikowego pliku JAR, WAR itp. Dodatkowo ma wylistowane moduły w tagu modules. Poniżej dołączam przykładowy pom.xml dla rodzica.

W każdym z nowych modułów w pliku pom.xml pojawi się dodatkowo odniesienie do rodzica, co odróżnia dziedziczenie od agregacji.

Dziedziczenie zależności

Moduły w Mavenie dziedziczą po pom.xml rodzica między innymi zależności i pluginy. Jeśli zadeklarujemy zależność w rodzicu, to możemy ją wykorzystywać w każdym module bez konieczności deklaracji w pom.xml.

Często do różnych modułów potrzebujemy różnych zależności, wtedy warto utworzyć w rodzicu dependencyManagement, który porządkuje używane wersje i zasięg bibliotek. Unikniemy konfliktów zależności między modułami. Przykład deklaracji Guavy w pom.xml rodzica:

W module, w którym potrzebujemy wykorzystać bibliotekę deklarujemy bibliotekę bez wersji i zasięgu. Wartości będą ustalone na podstawie informacji z pom.xml rodzica.

Dzięki takiemu rozwiązaniu nie dość, że kontrolujemy numer wersji używanej biblioteki, to przy aktualizacji wersji biblioteki robimy to tylko w jednym miejscu,

Super POM

Każdy pom.xml domyślnie dziedziczy z super POM, jego pełny wygląd możecie zobaczyć w dokumentacji. Super POM zawiera domyślną konfigurację projektu, przykładowo lokalizację centralnego repozytorium Mavena. Określa również domyślną konfigurację budowania m. in. katalog w którym będzie plik wynikowy.

Agregacja modułów

Dziedziczenie modułów nadaje się idealnie, kiedy moduły mają wspólną konfigurację. W przypadku kiedy potrzebujemy zbudować kilka modułów z niezależną konfiguracją lepiej zastosować agregację.

Moduł który agreguje inne moduły powinien mieć ustawione pakowanie na pom oraz zawierać listę modułów, czyli wyglądać analogicznie jak pom.xml rodzica w przypadku dziedziczenia. Różnicą jest to, że moduły nie mają odniesienia do modułu agregującego.


Zdjęcie wyróżniające: FreeImages.com/ela23

Related Posts

Confitura 2016

W tym roku odbyła się jubileuszowa 10 edycja Confitury. Konferencję mogę szczerze polecić każdemu kto chce być na bieżąco z technologiami związanymi z JVM. Wykłady były na bardzo dobrym poziomie. Jak co roku poznałam kilka nowych osób i spotkałam znajomych, z którymi widuję się tylko na branżowych konferencjach. Luźna atmosfera pozwoliła na rozmowę z prelegentami.

Read More

PJUG Kraków – Java 9 i JUnit 5

Na kolejnym meetupie Polish Java User Group w Krakowie same nowości – Java 9 i JUnit 5. Coraz więcej wiadomo o Javie 9 – tym razem można było zobaczyć przykłady kodu korzystającego z JDK 9 Early Access Release. Na drugim wykładzie dowiedziałam się jak będzie wyglądała nachodząca wersja jednej z najpopularniejszych bibliotek do testowania – JUnit.

Read More

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *