Правильный способ использования мультимодульного проекта 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
пометить как библиотеку.