1. Обзор
В этом руководстве мы узнаем о разрешении Parent POM Maven . Во-первых, мы обнаружим поведение по умолчанию. Затем мы обсудим возможности его настройки.
2. Разрешение родительского POM по умолчанию
Если мы хотим указать родительский POM, мы можем сделать это, назвав groupId
, ArtiftId
и version
, так называемую координату GAV
. Maven не разрешает родительский POM, сначала выполняя поиск в репозиториях . Мы можем найти подробности в документации по модели Maven и резюмировать поведение:
- Если в родительской папке есть файл
pom.xml
, и если этот файл имеет совпадающую координату GAV, он классифицируется как родительский POM проекта. - Если нет, Maven возвращается к репозиториям.
Размещение проекта Maven в другом является лучшей практикой при управлении многомодульными проектами . Например, у нас есть проект агрегатора со следующей координатой GAV:
<groupId>com.foreach.maven-parent-pom-resolution</groupId>
<artifactId>aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
Затем мы могли бы поместить модуль в подпапку и обратиться к агрегатору как к родителю:
Таким образом, POM module1 может включать в себя этот раздел:
<artifactId>module1</artifactId>
<parent>
<groupId>com.foreach.maven-parent-pom-resolution</groupId>
<artifactId>aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
Нет необходимости устанавливать агрегатор POM в репозиторий. И даже не нужно объявлять module1
в POM агрегатора. Но мы должны знать, что это применимо только для локальных проверок проекта (например, при сборке проекта). Если проект разрешается как зависимость от репозитория Maven, родительский POM также должен быть доступен в репозитории.
И мы должны убедиться, что агрегатор POM имеет соответствующую координату GAV. В противном случае мы получим ошибку сборки:
[ERROR] Non-resolvable parent POM for com.foreach.maven-parent-pom-resolution:module1:1.0.0-SNAPSHOT:
Could not find artifact com.foreach.maven-parent-pom-resolution:aggregator:pom:1.0-SNAPSHOT
and 'parent.relativePath' points at wrong local POM @ line 7, column 13
3. Настройка расположения родительского POM
Если родительский POM не находится в родительской папке, нам нужно использовать тег relativePath
для ссылки на местоположение. Например, если у нас есть второй модуль, который должен наследовать настройки от модуля1
, а не от агрегатора, мы должны назвать родственную папку:
<artifactId>module2</artifactId>
<parent>
<groupId>com.foreach.maven-parent-pom-resolution</groupId>
<artifactId>module1</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../module1/pom.xml</relativePath>
</parent>
Конечно, мы должны использовать только те относительные пути, которые доступны в каждой среде (в основном пути в пределах одного и того же репозитория Git), чтобы обеспечить переносимость нашей сборки.
4. Отключить разрешение локального файла
Чтобы пропустить локальный поиск файлов и напрямую искать родительский POM в репозиториях Maven, нам нужно явно установить относительный путь
в пустое значение:
<parent>
<groupId>com.foreach</groupId>
<artifactId>external-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath/>
</parent>
Это должно быть лучшей практикой, когда мы наследуем от внешних проектов, таких как Spring Boot .
5. IDE
Интересно, что IntelliJ IDEA (текущая версия: 2021.1.3) поставляется с подключаемым модулем Maven, который отличается от внешних сред выполнения Maven разрешением Parent POM. Отклоняясь от схемы Maven POM , он объясняет тег relativePath
следующим образом:
[…] Maven сначала ищет родительский pom в реакторе текущих строительных проектов […]
Это означает, что для внутреннего разрешения IDE положение родительского POM не имеет значения, если родительский проект зарегистрирован как проект IntelliJ Maven. Это может быть полезно для простой разработки проектов без их явного создания (если они не входят в область действия одного и того же репозитория Git). Но если мы попытаемся собрать проект с внешней средой выполнения Maven, это не удастся.
6. Заключение
В этой статье мы узнали, что Maven не разрешает родительские POM, сначала выполняя поиск в репозиториях Maven. Он скорее ищет его локально, и мы явно должны деактивировать это поведение при наследовании от внешних проектов. Кроме того, IDE могут дополнительно разрешать проекты в рабочей области, что может привести к ошибкам при использовании внешних сред выполнения Maven.
Как всегда, код примера доступен на GitHub .