Как организовать управление зависимостями для реактора Maven, если дочерние модули имеют независимую версию?
У нас есть реактор pom, чьи дочерние модули имеют независимую версию, т.е. Дочерний модуль объявляет свою собственную версию, которая не зависит от версии основного модуля. Однако существует зависимость между двумя дочерними модулями. Как должна быть настроена эта зависимость, чтобы всегда использовать версию, которая объявлена фактическим модулем pom реактора?
Я ожидаю, что смогу настроить управление зависимостями в корневом pom и использовать некоторые неявные свойства для определения версии дочерних модулей, но лучший вариант, который я могу найти:
${session.projectDependencyGraph.sortedProjects[0].version}
или просто
${reactorProjects[0].version}
так что управление зависимостями в корневом pom будет выглядеть так:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>mySubmodule</artifactid>
<version>${reactorProjects[0].version}</version>
</dependency>
</dependencies>
</dependencyManagement>
выглядит ненадежным, потому что порядок реактора может измениться при добавлении новых модулей или зависимостей.
Может быть, этот сценарий использования не рекомендуется из-за дизайна, и тогда я хотел бы знать, почему.
Изменить: Как предлагается в комментариях, объявление глобальных свойств с дочерними версиями в родительском POM может быть вариантом для более новых версий Maven. Однако я хотел бы увидеть некоторый анализ в отношении более широких последствий, таких как рабочий процесс, выпуск, настройки каталогов и репозитория, использование некоторых плагинов (например, плагин версии) и т. Д. Например, я думаю, что прямым следствием этого подхода является то, что мне придется выпустить родительский модуль всякий раз, когда любой из дочерних модулей выпущен. Хотя это выполнимо, это повлияет на первоначальную идею независимого управления версиями.
2 ответа
Я начал тему с этой темой в списке рассылки Maven, я публикую TL;DR ответ здесь:
Мое ожидаемое решение с неявными свойствами в общем случае невозможно, поскольку оно будет оцениваться не только во время сборки, но и при использовании встроенного артефакта в качестве зависимости в других проектах, и тогда его оценка может иметь непредсказуемые результаты, поскольку контекст неявных свойств совершенно другой, (Я глуп, у меня уже была такая же проблема уже со свойством ${project.version})
Вообще говоря, этот вопрос рассматривает только один сценарий в одном проекте с одной точки зрения разработчика. В потоке списка рассылки есть и другие точки зрения, которые приводят к жесткому кодированию номеров версий зависимостей либо в управлении зависимостями, либо в явных свойствах, даже если возможно что-то еще.
Я бы предложил использовать зависимость в родительском помпе. Вы можете определить все версии de всех зависимостей там. Затем вы можете опустить версию зависимостей в разных модулях.
Итак, в родительском:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>myModule</artifactid>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
В модуле вы затем используете
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>myModule</artifactid>
</dependency>
</dependencies>
Будет использоваться версия, определенная в dependencyManagement.
Я бы порекомендовал определить версию всех зависимостей, как это в родительском пом.