«1. Обзор

В этом руководстве мы покажем, как создать многомодульный проект с помощью Maven.

Сначала мы обсудим, что такое многомодульный проект, и рассмотрим преимущества такого подхода. Затем мы настроим наш образец проекта. Чтобы получить хорошее представление о Maven, ознакомьтесь с этим руководством.

2. Многомодульный проект Maven

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

Теперь подмодули являются обычными проектами Maven, и их можно собирать отдельно или через агрегатор POM.

При построении проекта с помощью агрегатора POM каждый проект с типом упаковки, отличным от pom, приведет к построению файла архива.

3. Преимущества использования мультимодулей

Существенным преимуществом использования этого подхода является то, что мы можем уменьшить дублирование.

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

Кроме того, в реальном мире проектам могут потребоваться определенные плагины Maven для выполнения различных операций в течение жизненного цикла сборки, совместного использования зависимостей и профилей или включения других проектов BOM.

Таким образом, при использовании нескольких модулей мы можем создавать модули нашего приложения с помощью одной команды, и если порядок имеет значение, 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.

<packaging>pom</packaging>

Установив для упаковки тип pom, мы заявляем, что проект будет служить родителем или агрегатором — он больше не будет производить артефакты.

Теперь, когда наш агрегатор готов, мы можем сгенерировать наши подмодули.

«Тем не менее, мы должны отметить, что это место, где находится вся конфигурация для совместного использования, которая в конечном итоге повторно используется в дочерних модулях. Помимо прочего, мы можем использовать здесь dependencyManagement или pluginManagement.

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

Поскольку наш родительский POM был назван parent-project, нам нужно убедиться, что мы находимся в родительском каталоге, и запустить команды генерации:

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, добавив несколько тегов:

<modules>
    <module>core</module>
    <module>service</module>
    <module>webapp</module>
</modules>

Теперь наш родитель явно объявляет агрегированные модули.

Затем, при запуске команды mvn package в каталоге родительского проекта, Maven соберет и протестирует все три модуля.

Более того, Maven Reactor проанализирует наш проект и соберет его в нужном порядке. Итак, если наш модуль веб-приложения зависит от модуля службы, Maven сначала создаст службу, а затем веб-приложение.

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

<parent>
    <groupId>org.baeldung</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

Нужно отметить, что подмодули могут иметь только один родитель. Однако мы можем импортировать множество спецификаций. Более подробную информацию о файлах 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.

«