Мультимодульный проект с Maven

Мультимодульный проект с Maven

1. обзор

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

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

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

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

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

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

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

Существенным преимуществом использования этого подхода является то, чтоwe may reduce duplication.

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

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

Следовательно, при использовании нескольких модулей мы можемbuild our application’s modules in a single command, и если порядок имеет значение, Maven разберется с этим за нас. Также мы можемshare a vast amount of configuration with other modules.

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

Maven поддерживает наследование таким образом, чтоeach pom.xml file has the implicit parent POM, it’s called Super POM и может находиться в двоичных файлах Maven. Эти два файла объединены Maven и образуют Эффективное ПОМ.

Следовательно, мы можем создать нашown pom.xml file which will serve us as the parent project. Затем мы можем включить туда всю конфигурацию с зависимостями и установить ее в качестве родителя наших дочерних модулей, чтобы они унаследовали от нее.

Помимо наследования, Maven предоставляет понятие агрегации. Родительский POM, использующий эту функциональность, называется агрегированным POM.. По сути, этот вид POMdeclares its modules explicitly in its pom.xml file.

5. подмодули

Подмодули или подпроекты - это обычные проекты Maven, которые наследуются от родительского POM. Как мы уже знаем, наследование позволяет нам делиться конфигурацией и зависимостями с подмодулями. Однако, если мы хотим собрать или выпустить наш проект за один раз, мы должны явно объявить наши подмодули в родительском POM. В конечном счете, наше родительское POM будет как родительским, так и совокупным POM.

6. Сборка приложения

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

Это приложение будет состоять из трех модулей, которые будут представлять:

  • core part нашего домена

  • Вебservice , предоставляющий некоторые REST API

  • Awebapp , содержащий какие-либо веб-ресурсы, ориентированные на пользователя

Поскольку мы сосредоточимся на Maven, реализация этих сервисов останется неопределенной.

6.1. Генерация родительского POM

First, let’s create a parent project:

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

Как только родительский элемент создан, мы должны открыть файлpom.xml, расположенный в родительском каталоге, и изменить упаковку на pom.

pom

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

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

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

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

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

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

Обратите внимание на используемую команду. Это так же, как мы использовали для родителя. Дело в том, что эти модули являются обычными проектами Maven, но Maven признал, что они вложены. Когда мы изменили каталог наparent-project, выяснилось, что родительский файл имеет упаковку типаpom, и соответственно изменили оба файлаpom.xml .

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


    core
    service
    webapp

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

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

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

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


    org.example
    parent-project
    1.0-SNAPSHOT

Нужно отметить, что у подмодулей может быть только один родитель. Тем не менее, мы можем импортировать много спецификаций. Более подробную информацию о файлах спецификации можно найти вthis article.

6.3. Строим проект

Now we can build all three modules at once. В каталоге родительского проекта запустите:

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 перечисляетparent-project, но поскольку это типpom, он исключен, и в результате сборки создаются три отдельных файла.jar для всех остальных модулей. В этом случае сборка происходит в трех из них.

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

В этом руководстве мы обсудили преимущества использования мультимодулей Maven. Кроме того, мы различали обычный родительский POM Maven и агрегированный POM. В конце мы показали, как настроить простой мультимодуль для начала игры.

Maven - отличный инструмент, но он сложен сам по себе. Если вы хотите узнать больше о Maven, взгляните наSonatype Maven reference илиApache Maven guides. Если вам нужны расширенные возможности настройки нескольких модулей Maven, посмотритеhow Spring Boot project leverages the usage of it.

Все примеры кода в примере созданы с использованием Maven, поэтому вы можете легко проверить нашGitHub project website, чтобы увидеть различные конфигурации Maven.