Правильный способ использования мультимодульного проекта Maven

В мультимодели Maven у нас есть родительский pom с модулями, определенными в <modules> тег, и в каждом модуле мы определяем, кто является родительским pom.

Почему это двустороннее определение?
Почему бы не определить отношения между ними только в родительской части модулей?
Как я должен повторно использовать модули, если они всегда связаны с одним родителем?

2 ответа

Решение

Почему это двухстороннее определение?

Это не обязательно. Это выбор дизайна.

почему бы не определить только в родительском?

Если вы определяете их только в modules тег родительского пом, вы будете использовать только функцию реактора / агрегации Maven.

1) Агрегация ( <modules> Объявление в проекте супер агрегатора) предоставляет в основном следующие возможности:

Собирает все доступные модули для сборки

Сортирует проекты в правильном порядке сборки

Строит выбранные проекты по порядку

Модуль агрегации включается путем объявления модулей для агрегирования в родительском модуле:

<modules>
    <module>my-child</module>
    <module>my-other-child</module>
</modules>

Но агрегация не обеспечивает наследование.

2) Наследование проекта ( <parent> объявление в дочерних модулях) обеспечивает наследование нескольких вещей из родительского объявления в дочерний модуль:

Из фактической документации большинство элементов из родительского POM наследуются его дочерними элементами.
:

идентификатор_группы

версия

описание

URL

inceptionYear

организация

лицензии

Разработчики

авторы

Списки рассылки

СКМ

issueManagement

ciManagement

свойства

dependencyManagement

зависимости

хранилища

pluginRepositories

строить

исполнения плагинов с соответствующими идентификаторами

конфигурация плагина

составление отчетов

профили

Наследование включается путем объявления родительского артефакта в дочерних poms:

<parent>
    <groupId>my-group</groupId>
    <artifactId>my-parent</artifactId>
    <version>1.0.0</version>
</parent>

<!-- You can note that groupId and version are not filled for the current project.
 These are optional as inherited from the parent -->
<artifactId>my-artifact</artifactId>

Фактически, вы можете использовать наследование проекта, композицию проекта, ни одно из них или оба.
Это действительно выбор дизайна, который должен быть сделан в соответствии с отношением между проектами и их требованиями.

Вы можете сослаться на этот интересный момент в документации Maven об этих двух функциях:

Наследование проекта против агрегации проекта

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

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

Но, конечно, вы можете иметь как наследование проекта, так и агрегацию проекта. Это означает, что ваши модули могут указывать родительский проект, и в то же время этот родительский проект должен указывать эти проекты Maven в качестве своих модулей.

Потому что, когда вы создаете некоторый подмодуль, он теперь должен иметь некоторую метаинформацию, такую ​​как, например, версия зависимости, и, как правило, лучше помещать эту зависимость в родительский pom. dependencyManagementпотому что я бы заставил все подмодули использовать одну и ту же версию библиотеки. Также есть другая мета-информация, которая может быть полезна, например properties,

Итак, в целом, когда вы создаете конкретный подмодуль, mavben должен знать некоторую информацию, которую вы обычно настраиваете в родительском pom.

Я считаю, что для этого может быть больше причин, но для меня это наиболее очевидно.

Если вы хотите повторно использовать модули, на мой взгляд, вам нужно, чтобы эти модули были библиотекой, и добавьте их через dependency пометить как библиотеку.

Другие вопросы по тегам