Версия Maven с собственностью
У меня есть большой проект Maven (Tycho) около 400 плагинов.
Мы указали версию приложения в каждом файле POM.
Есть ли способ указать версию для всех POM: s только на одном месте?
Я ожидаю, что некоторые подумают:
<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>
....
<version>${buildVersion}</version>
У нас есть родительский pom.xml
:
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>pom</packaging>
Затем в каждом POM ссылается на родительский POM:
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>1.1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
Ответы
Ответ 1
Если у вас есть родительский проект, вы можете установить версию в родительском pom, а в дочерних вас можно ссылаться на libs-библиотеки sibling с свойствами ${project.version} или ${version}.
Если вы хотите избежать повторения версии родителя в каждом дочернем элементе: вы можете сделать это:
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>
<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>
И тогда в ваших детях вам придется делать:
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>${my.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<packaging>eclipse-plugin</packaging>
<dependencies>
<dependency>
<groupId>company</groupId>
<artifactId>otherartifact</artifactId>
<version>${my.version}</version>
or
<version>${project.version}</version>
</dependency>
</dependencies>
HTH
Ответ 2
Использование свойства для версии генерирует следующее предупреждение:
[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
Если ваша проблема заключается в том, что вам нужно изменить версию в нескольких местах, потому что вы переключаете версии, то правильная вещь, которую нужно сделать, это использовать Maven Release Plugin, который сделает это для вас автоматически.
Ответ 3
В версии Maven версии 3.5 или выше вы должны иметь возможность использовать заполнитель (например, $ {revision}) в родительском разделе, а внутри остальной части pom можно использовать ${project.version}
.
На самом деле, вы также можете опустить свойства проекта вне parent
которые одинаковы, так как они будут унаследованы. Результат будет выглядеть примерно так:
<project>
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>${revision}</version> <!-- use placeholder -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>artifact</artifactId>
<!-- no 'version', no 'groupId'; inherited from parent -->
<packaging>eclipse-plugin</packaging>
...
</project>
Для получения дополнительной информации, особенно о том, как разрешить заполнитель во время публикации, см. Версии Maven CI Friendly | Multi Module Setup.
Ответ 4
Правильный ответ такой (пример версии):
-
В родительском pom.xml вы должны иметь (не внутри properties
):
<version>0.0.1-SNAPSHOT</version>
-
Во всех дочерних модулях вы должны иметь:
<parent>
<groupId>com.vvirlan</groupId>
<artifactId>grafiti</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
Так что это жестко закодировано.
Теперь, чтобы обновить версию, вы делаете это:
mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
mvn versions:commit # Necessary to remove the backup file pom.xml
и все ваши 400 модулей будут иметь обновленную родительскую версию.
Ответ 5
Если вы используете Maven 3, один из способов обойти эту проблему - использовать плагин версий
http://www.mojohaus.org/versions-maven-plugin/
В частности, команды
mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit
Это обновит родительский и детский poms до 2.0-RELEASE. Вы можете запустить это как шаг сборки раньше.
В отличие от плагина выпуска, он не пытается разговаривать с вашим источником управления
Ответ 6
См. Раздел "версия" форума Maven - Users, содержащий выражение, но оно должно быть константой. Лучший способ добавить новую версию? :
вот почему это плохой план.
у развернутого pom не будет разрешено значение свойства, поэтому любой, кто зависит от этого pom, выберет зависимость как строку, не интерполированную с $ {}, и в процессе сборки возникнет много веселья.
в maven 2.1.0 и/или 2.2.0 была предпринята попытка развернуть poms с разрешенными свойствами... это сломало больше, чем ожидалось, поэтому эти две версии не рекомендуются, 2.2.1 - рекомендуемая версия 2.x,