Ответ
Родительский POM (Parent POM) — это специальный проект Maven, от которого другие проекты (модули) могут наследовать общие конфигурации. Это ключевой механизм для устранения дублирования в многомодульных сборках.
Основные наследуемые элементы:
- Зависимости (
<dependencies>и<dependencyManagement>). - Плагины и их конфигурации (
<plugins>и<pluginManagement>). - Свойства (
<properties>). - Версии (
<version>), идентификаторы группы (<groupId>). - Конфигурации репозиториев, отчётов и сборки.
Пример объявления родителя в дочернем pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company</groupId>
<artifactId>platform-parent</artifactId>
<version>2.0.0</version>
<!-- Опционально: относительный путь к родительскому pom.xml -->
<relativePath>../platform-parent/pom.xml</relativePath>
</parent>
<artifactId>my-service</artifactId>
...
</project>
Ключевые особенности:
<relativePath>: Указывает путь для локального поиска родительского POM. Если элемент отсутствует или файл не найден, Maven загрузит артефакт из репозитория.- Агрегация vs Наследование: Родительский POM (
<packaging>pom</packaging>) может также выступать как агрегатор в многомодульном проекте, объединяя модули в<modules>. - Переопределение: Дочерний POM может переопределить любую унаследованную конфигурацию.
Ответ 18+ 🔞
А, ну это ж классика, ёпта! Сидишь такой, пишешь свой pom.xml, а там один и тот же хуйня-плагин в каждом модуле копипастишь. Волнение ебать, терпения ноль! И тут на тебе — родительский POM, как манна небесная, блядь.
Представь себе этакого папашу-проекта, который всем своим детишкам-модулям говорит: «Сидите, суки, не рыпайтесь, я за вас всё пропишу». И правда, зачем в каждом модуле одно и то же городить?
Что этот хитрожопый родитель может впендюрить своим наследникам:
- Все эти бесконечные зависимости (
<dependencies>), да ещё и с управлением версиями (<dependencyManagement>), чтобы бардака не было. - Плагины, блядь, эти ёбаные плагины с их конфигами (
<plugins>). - Свойства всякие (
<properties>), версии,groupId— короче, всю базовую хуйню. - Да даже репозитории, куда бегать за артефактами, можно один раз прописать.
Вот как детишка заявляет, что он от папаши:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company</groupId>
<artifactId>platform-parent</artifactId>
<version>2.0.0</version>
<!-- Смотри, папку, а то в репозиторий побежит искать! -->
<relativePath>../platform-parent/pom.xml</relativePath>
</parent>
<artifactId>my-service</artifactId>
...
</project>
А теперь тонкости, чтобы не обосраться:
<relativePath>: Это, сука, указание «ищи папу вот тут, рядом». Если не найдешь или забудешь написать — Maven такой: «А, окей, пошел на центральный репозиторий скачивать твоего папу, сиди жди». Удивление пиздец, когда сборка час идет.- Два в одном: Этот родительский POM обычно упакован как
<packaging>pom</packaging>. Он может быть не только папкой, но и начальником, который в<modules>перечисляет всех своих подчиненных-модулей. Агрегация и наследование в одном флаконе, ядрёна вошь! - Бунт на корабле: Дочерний проект — не безмозглая тварь. Если ему что-то не нравится в наследстве, он может это запросто переписать под себя. Сила воли, блядь!
Короче, родительский POM — это чтобы не изобретать велосипед в каждом модуле и не охреневать от однообразия. Чистая магия, только без ёбушки-воробушки.