Многомодулен проект с Maven

1. Общ преглед

В този урок ще покажем как да изградим многомодулен проект с Maven.

Първо ще обсъдим какво е мултимодулен проект и ще разгледаме ползите от следването на този подход. След това ще настроим нашия примерен проект. За добро въведение в Maven, вижте този урок.

2. Многомодулният проект на Maven

Мултимодулният проект е изграден от агрегатор POM, който управлява група подмодули. В повечето случаи агрегаторът се намира в основната директория на проекта и трябва да има опаковка от тип pom .

Сега подмодулите са редовни проекти на Maven и те могат да бъдат изградени отделно или чрез агрегатора POM.

Чрез изграждането на проекта чрез агрегатора POM, всеки проект, който има различен тип опаковка от pom, ще доведе до изграден архивен файл.

3. Ползи от използването на мулти-модули

Значителното предимство на използването на този подход е, че можем да намалим дублирането.

Да приемем, че имаме приложение, което се състои от няколко модула, нека бъде модул отпред и модул отзад. Сега работим и върху двамата и променяме функционалността, която засяга двете. В този случай, без специализиран инструмент за изграждане, ще трябва да изградим двата компонента поотделно или да напишем скрипт, който да компилира кода, да стартира тестове и да покаже резултатите. След това, след като получим още повече модули в проекта, ще стане по-трудно да се управлява и поддържа.

Освен това в реалния свят проектите може да се нуждаят от определени плъгини на Maven, за да извършват различни операции по време на жизнения цикъл на компилацията, да споделят зависимости и профили или да включват други проекти за спецификации.

Следователно, когато използваме мулти-модули, можем да изградим модулите на нашето приложение с една команда и ако редът има значение, Maven ще разбере това за нас. Също така можем да споделяме огромно количество конфигурация с други модули .

4. Родителски POM

Maven поддържа наследяване по начин, по който всеки файл pom.xml има неявния родителски POM, нарича се Super POM и може да се намира в двоичните файлове на Maven. Тези два файла се обединяват от Maven и образуват Ефективния POM.

Следователно можем да създадем наш собствен файл pom.xml, който ще ни служи като родителски проект . След това можем да включим там цялата конфигурация със зависимости и да зададем това като родител на нашите дъщерни модули, така че те да наследят от него.

Освен наследството, Maven предоставя понятието за агрегиране. Родителският POM, който използва тази функционалност, се нарича агрегиран POM . По принцип този вид POM декларира своите модули изрично в своя pom.xml файл.

5. Подмодули

Подмодулите или подпроектите са редовни проекти на Maven, които наследяват от родителския POM. Както вече знаем, наследяването ни позволява да споделяме конфигурацията и зависимостите с подмодули. Ако обаче искаме да изградим или пуснем нашия проект с един изстрел, трябва да декларираме нашите подмодули изрично в родителския POM. В крайна сметка нашият родителски POM ще бъде родителският, както и съвкупният POM.

6. Изграждане на приложението

Сега, когато разбираме подмодулите и йерархията на Maven, нека създадем примерно приложение, което да ги демонстрира. Ще използваме интерфейса на командния ред на Maven, за да генерираме нашите проекти.

Това приложение ще се състои от три модула, които ще представляват:

  • В основната част на нашия домейн
  • Уеб услуга, предоставяща някои REST API
  • А уеб приложение , съдържащ, видими за потребителите на уеб активи на някакъв вид

Тъй като ще се съсредоточим върху Maven, изпълнението на тези услуги ще остане недефинирано.

6.1. Генериране на родителски POM

Първо, нека създадем родителски проект :

mvn archetype:generate -DgroupId=org.baeldung -DartifactId=parent-project

След като родителят е генериран, трябва да отворим файла pom.xml, намиращ се в директорията на родителя, и да сменим опаковката на pom.

pom

Като задаваме опаковката на тип pom, декларираме, че проектът ще служи като родител или агрегатор - няма да създава допълнителни артефакти.

Сега, когато нашият агрегатор приключи, ние можем да генерираме нашите подмодули.

Трябва обаче да отбележим, че това е мястото, където се намира цялата конфигурация, която трябва да бъде споделена и в крайна сметка се използва повторно в дъщерни модули. Наред с други неща, тук можем да използваме зависимосттаУправление или приставкатаУправление .

6.2. Създаване на подмодули

Тъй като нашият родителски POM беше наречен родителски проект , трябва да се уверим, че сме в директорията на родителя и да изпълним команди за генериране :

cd parent-project mvn archetype:generate -DgroupId=org.baeldung -DartifactId=core mvn archetype:generate -DgroupId=org.baeldung -DartifactId=service mvn archetype:generate -DgroupId=org.baeldung -DartifactId=webapp

Забележете използваната команда. Същото е, което използвахме за родителя. Работата тук е, че тези модули са обикновени проекти на Maven, но Maven разпозна, че са вложени. Когато променихме директорията на родителски проект , той установи, че родителят има опаковка от тип pom и съответно модифицира и двата pom.xml файла.

След това Maven ще генерира три подмодула и ще модифицира за нас файла pom.xml на родителя, като добави някои маркери:

 core service webapp 

Сега нашият родител изрично декларира агрегирани модули.

След това, когато изпълнява команда mvn пакет в директорията на родителския проект, Maven ще изгради и тества и трите модула.

Освен това Maven Reactor ще анализира нашия проект и ще го изгради в правилния ред. Така че, ако нашият модул webapp зависи от сервизния модул, Maven ще изгради първо услугата , след това webapp .

В крайна сметка, ако искаме да споделим цялата конфигурация с нашите подмодули, в техните файлове pom.xml , ще трябва да декларираме родителя:

 org.baeldung parent-project 1.0-SNAPSHOT 

Трябва да отбележим, че подмодулите могат да имат само един родител. Въпреки това можем да импортираме много спецификации. Повече подробности за BOM файловете можете да намерите в тази статия.

6.3. Изграждане на проекта

Сега можем да изградим и трите модула наведнъж. В директорията на родителския проект изпълнете:

mvn package

Това ще изгради всички модули, трябва да видим следния изход на командата:

[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] parent-project [INFO] core [INFO] service [INFO] webapp ... [INFO] Reactor Summary: [INFO] parent-project ..................................... SUCCESS [ 0.140 s] [INFO] core ............................................... SUCCESS [ 2.195 s] [INFO] service ............................................ SUCCESS [ 0.767 s] [INFO] webapp ............................................. SUCCESS [ 0.572 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------

Reactor изброява родителския проект , но тъй като е тип pom , той е изключен и компилацията води до три отделни .jar файла за всички останали модули. В този случай изграждането се извършва при три от тях.

7. Заключение

В този урок обсъдихме ползите от използването на мултимодули Maven. Също така разграничихме редовния POM на Maven и агрегирания POM. В крайна сметка показахме как да настроим прост мулти-модул, с който да започнем да играем.

Maven е чудесен инструмент, но е сложен сам по себе си. Ако искате да намерите повече подробности за Maven, погледнете справочника за Sonatype Maven или ръководствата за Apache Maven. Ако търсите усъвършенствано използване на създадените мултимодули Maven, погледнете как проектът Spring Boot използва използването му.

Всички примери за код на Baeldung са изградени с помощта на Maven, така че можете лесно да проверите нашия уебсайт на проекта GitHub, за да видите различни конфигурации на Maven.