barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 18 ноября 2016 г.

Maven и наследование версий

Задача

Есть проект со сложной иерархией - корневая pom-ка содержит ряд модулей, каждый из модулей, в свою очередь, так является многомодульным и т.п.:
pom.xml
 |_ module1
     |_ pom.xml
     |_ submodule1
         |_ pom.xml
     |_ submodule2
         |_ pom.xml
 |_ module2
     |_ pom.xml
     |_ submdule3
         |_ pom.xml
Есть желание задавать версию всего проекта только в корневой pom-ке, чтобы все вложенные модули ее наследовали.

Однако, не все так просто, как хотелось бы. Ситуация следующая:
  • Дочерний проект может не указывать в своей pom-ке версию, тогда версия подтянется из родительского проекта. И это хорошо.
  • Однако, когда мы в pom-ке дочернего проекта указываем родителя, его версия является обязательной, хотя, казалось бы, при указании relativePath в этом нет необходимости - определение родительского проекта по указанному относительному пути в любом случае будет однозначным
Решение

Решение нетривиально и подсказано https://www.igorkromin.net/index.php/2015/11/08/getting-around-mavens-parent-child-project-version-dependency-issue/. В качестве версии родительского проекта во всех дочерних pom-ках указываем не конкретную версию, а диапазон версий, заведомо более широкий, чем реально возможные версии проекта:
<parent>
<groupId>somegroup</groupId>
<artifactId>someparent</artifactId>
<version>[1.0,99.0)</version>
<relativePath>../</relativePath>
</parent>
В итоге, версия задается только в верхнеуровневой pom-ке и пропагируется во все дочерние проекты.
Подход работает на Maven 3.2.2+.

Комментариев нет:

Отправить комментарий