2016-08-11 1 views
3

Описания проблемыИзбегайте неправильную версию интерполяцию, если П версия ребенка отличается от тех, агрегатора П родителя и его вспомогательных модулей

У нас есть агрегатор 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

без подводных камней проектной интерполяции переменных?

ответ

3

Плагин релиз специалист может изменить версии зависимостей, управляемых в родительском ПОМ.

Так что, если вы определяете Maven родителя, как это:

<groupId>com.acme</groupId> 
<artifactId>zoo</artifactId> 
<version>2.0.0-SNAPSHOT</version> 
<packaging>pom</packaging> 

<modules> 
    <module>cat</module> 
    <module>dog</module> 
</modules> 

<dependencyManagement> 
<dependencies> 
    <dependency> 
    <groupId>com.acme</groupId> 
    <artifactId>cat</artifactId> 
    <version>2.0.0-SNAPSHOT</version> 
    </dependency> 
    <!-- other child modules go here --> 
</dependencies> 
</dependencyManagement> 

Как вы видите версии материнской и управляемой зависимости одинаковы. Я установил их в версию SNAPSHOT, потому что релиз-плагин создаст окончательные версии при выпуске: выполните

Ваши детские поры могут оставаться такими, какие у вас были.

Потому что в вашей установке, ваш родительский проект также реактор, то вы можете позвонить

mvn release:perform -DautoVersionSubmodules=true 

который обновит версию родителя во всех подмодулях при выполнении этой команды. Эта опция по существу такая же, как если бы вы запускали

mvn versions:update-child-modules 

означает, что это изменит детские поры.

После запуска МВН-релиз: выполнить команду ваш родитель ПОМ будет выглядеть следующим образом:

<groupId>com.acme</groupId> 
<artifactId>zoo</artifactId> 
<version>2.0.1-SNAPSHOT</version> 
<packaging>pom</packaging> 

<modules> 
    <module>cat</module> 
    <module>dog</module> 
</modules> 

<dependencyManagement> 
<dependencies> 
    <dependency> 
    <groupId>com.acme</groupId> 
    <artifactId>cat</artifactId> 
    <version>2.0.1-SNAPSHOT</version> 
    </dependency> 
    <!-- other child modules go here --> 
</dependencies> 
</dependencyManagement> 

и ваш ребенок помам нравится эта

<parent> 
    <groupId>com.acme</groupId> 
    <artifactId>zoo</artifactId> 
    <version>2.0.1-SNAPSHOT</version> 
</parent> 

<groupId>com.acme</groupId> 
<artifactId>cat</artifactId> 

<dependencies> 
    <dependency> 
    <groupId>com.acme</groupId> 
    <artifactId>dog</artifactId> 
    </dependency> 
</dependencies> 

Окончательные версии будут существовать только в теге созданный выпуском: подготовить команду.

PS: Вы можете определить другие версии для окончательной и следующей версии разработки, когда они будут предложены после запуска выпуска: подготовить команду.

2

Самое простое решение изменить POM зоопарка и заменить <version>${project.version}</version> с <version>2.0.0</version>

Обратите внимание:

  1. при изменении версии к следующему номеру, например 2.0.1, с versions-maven-plugin, зависимость раздел управления будет также обновлен .

  2. Spring использовать простейшее решение, см http://central.maven.org/maven2/org/springframework/spring-framework-bom/4.2.7.RELEASE/spring-framework-bom-4.2.7.RELEASE.pom

Резюме: использование <version>${project.version}</version> в управлении зависимостями неправильно идея.

0

С Maven Введение в ПОМ: Наследование http://maven.apache.org/guides/introduction/introduction-to-the-pom.html

Project> Пример 1> Решение

В качестве альтернативы, если мы хотим, чтобы GroupID и/или версии ваших модулей будет так же как и их родители, вы можете удалить groupId и/или идентификатор версии вашего модуля в POM.

<project> 
    <parent> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>my-app</artifactId> 
    <version>1</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 
    <artifactId>my-module</artifactId> 
</project> 
+1

Проблема в том, что 'cat' должен зависеть от' собаки' той же версии. Для этого применяется управление dependecy. Вы отвечаете не решает проблему с конфигурацией управления зависимостями – michaldo

+0

Ok. Теперь я понимаю, что вы имеете в виду. В этом случае у вас может быть кошка версии 1.1 с родительским 1.0, поэтому версия собаки будет равна 1.0. И это неправильно. –

+0

Ваш намек на удаление версии от кошки и собаки в порядке, но проблема в другом. На самом деле весь зоопарк имеет версию 2.0.0, а владелец вопроса хочет, чтобы кошка зависела от собаки без версии, определенной в cat 'pom.xml'. По этой причине версия собаки определена в разделе управления зависимостями зоопарка. Но версия определяется как '$ {project.version}', и это неправильно – michaldo

Смежные вопросы