Что такое родительский POM (parent) в Maven?

Ответ

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