Описания проблемыИзбегайте неправильную версию интерполяцию, если П версия ребенка отличается от тех, агрегатора П родителя и его вспомогательных модулей
У нас есть агрегатор POM Maven с некоторыми детьми РОМА (модулями), все с теми же версиями :
pom.xml (parent zoo, version 2.0.0)
|-- pom.xml (child module cat, version 2.0.0)
|-- pom.xml (child module dog, version 2.0.0)
|-- ...
В разделе управления зависимостями все дети объявляются с версией проекта для облегчения объявления зависимостей. Родитель П выглядит
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>
<modules>
<module>cat</module>
<module>dog</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>cat</artifactId>
<version>${project.version}</version>
</dependency>
<!-- other child modules go here -->
</dependencies>
</dependencyManagement>
Ребенок помы определяются как
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>
<groupId>com.acme</groupId>
<artifactId>cat</artifactId>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>
Существует еще один англичанин, который объявляет родительский POM в качестве родителя тоже (наследство), но не указан в качестве суба модуля в этот родитель (без агрегации). У этой помпы другая версия.
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>
<groupId>com.acme</groupId>
<artifactId>boo</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>
На самом деле мы ожидали, что версия зависимости com.acme.dog
вытягивается из секции управления зависимости от родительского П com.acme.zoo
и равно 2.0.0
. Однако Maven documentation on project interpolation and variables говорит
Следует отметить, что эти переменные обрабатываются после наследования, как описано выше. Это означает, что если родительский проект использует переменную, то ее определение в дочернем, а не в родительском, будет в конечном итоге использоваться.
То есть: в реакторе построить переменную ${project.version}
, используемую в секции управления зависимостями родительского П com.acme.zoo
оцениваются по отношению к com.acme.bar
и равному 1.0.0
то, что не по назначению.
Примечание
Существует обходной путь с помощью переменной в родительском ПОМ, который должен быть синхронизирован с версиями родительского пом. Однако это решение несовместимо с Maven Release Plugin.
Вопрос
Как мы можем достичь желаемого поведения
- агрегатор POM с детьми, имеющими ту же версию
- декларации детей в разделе управления зависимостей, чтобы убедиться, что все зависимости имеют такая же версия
- использование наследования вместе с различными версиями
- совместимость с
maven-release-plugin
без подводных камней проектной интерполяции переменных?
Проблема в том, что 'cat' должен зависеть от' собаки' той же версии. Для этого применяется управление dependecy. Вы отвечаете не решает проблему с конфигурацией управления зависимостями – michaldo
Ok. Теперь я понимаю, что вы имеете в виду. В этом случае у вас может быть кошка версии 1.1 с родительским 1.0, поэтому версия собаки будет равна 1.0. И это неправильно. –
Ваш намек на удаление версии от кошки и собаки в порядке, но проблема в другом. На самом деле весь зоопарк имеет версию 2.0.0, а владелец вопроса хочет, чтобы кошка зависела от собаки без версии, определенной в cat 'pom.xml'. По этой причине версия собаки определена в разделе управления зависимостями зоопарка. Но версия определяется как '$ {project.version}', и это неправильно – michaldo