Подтвердить что ты не робот

Версия 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>
4b9b3361

Ответ 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,