Что означает тег <parent> в Maven и для чего он используется
Что проверяют
Понимаете ли вы наследование POM и отличаете ли его от агрегации модулей. Обычно следом идёт вопрос, откуда в проекте берутся версии зависимостей, которые нигде не указаны явно.
Как отвечать
Тег <parent> указывает POM, от которого текущий проект наследует конфигурацию: свойства, dependencyManagement, pluginManagement, репозитории, профили, а также groupId и version, если они не заданы. У родителя обязательно <packaging>pom</packaging>.
<parent>
<groupId>com.example</groupId>
<artifactId>platform-parent</artifactId>
<version>1.0.0</version>
<relativePath/>
</parent>Что полезно добавить:
- наследование и агрегация это разные механизмы:
<parent>раздаёт настройки вниз, а<modules>в родителе собирает модули одной командой. Обычно это один файл, но совпадать они не обязаны; dependencyManagementтолько фиксирует версии и область видимости, сами зависимости в модуль не попадают. Объявлять их нужно, но уже без<version>;<relativePath>по умолчанию ищет родителя в../pom.xml, пустой тег заставляет брать его из репозитория;- когда наследоваться некуда, потому что родитель свой, версии библиотек подключают импортом BOM в
dependencyManagementсо<scope>import</scope>; - проверить итог помогает
mvn help:effective-pom, он показывает POM после наследования и подстановки свойств.
Где спотыкаются
Кладут библиотеку в <dependencies> родителя, чтобы «была везде». Она действительно приезжает во все модули, включая те, которым не нужна, и тянет за собой транзитивные зависимости. Для общих версий существует dependencyManagement.
Ждут, что правка родителя подхватится сама. Версия родителя прибита в дочернем POM гвоздями, и пока её не подняли, сборка берёт старую конфигурацию. Исключение только у SNAPSHOT, за что его и не любят в релизных сборках.
Ломают сборку путём к родителю. Модуль лежит на два уровня ниже или собирается из другого каталога, Maven по умолчанию читает совсем не тот файл и либо падает, либо молча наследует чужие версии.