Наследование версии проекта Maven - нужно ли указывать родительскую версию?

У меня есть два проекта: родительский проект: A, суб-проект: B

A / pom.xml:

<code><groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>
</code>

И в B / pom.xml у меня есть:

<code>    <parent>
        <groupId>com.dummy.bla</groupId>
        <artifactId>parent</artifactId>
        <version>0.1-SNAPSHOT</version>     
    </parent>

    <groupId>com.dummy.bla.sub</groupId>
    <artifactId>kid</artifactId>
</code>

Я хочу, чтобы B наследовал версию от parent, поэтому единственное место в моем случае мне нужно поставить0.1-SNAPSHOT являетсяA/pom.xml, Но если я удалю<version>0.1-SNAPSHOT</version> отB/pom.xml под родительским разделом maven жалуется на отсутствующую версию для родителя.

Есть ли способ, которым я могу просто использовать${project.version} или что-то подобное, чтобы избежать01.-SNAPSHOT в обоих помах?

 blong22 янв. 2014 г., 18:42
 Perception14 мая 2012 г., 13:18
Боюсь, вам придется дождаться Maven 3.1.
 jocull11 июл. 2018 г., 16:24
Ссылка выше перемещена. Окончательный статус был «Закрыт / Не исправлен».issues.apache.org/jira/browse/MNG-624
 Timur23 мая 2013 г., 11:52

Ответы на вопрос(7)

eFoxОтвет работал для одного проекта, но не тогда, когда я ссылался на модуль из другого (файл pom.xml все еще хранился в моем.m2 со свойством вместо версии).

Тем не менее, это работает, если вы объедините его сflatten-maven-plugin, поскольку он генерирует poms с правильной версией, а не со свойством.

Единственная опция, которую я изменил в определении плагина - этоoutputDirectoryпо умолчанию он пуст, но я предпочитаю иметь его вtarget, который установлен в моем.gitignore конфигурация:

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>flatten-maven-plugin</artifactId>
   <version>1.0.1</version>
   <configuration>
      <updatePomFile>true</updatePomFile>
      <outputDirectory>target</outputDirectory>
   </configuration>
   <executions>
      <execution>
         <id>flatten</id>
         <phase>process-resources</phase>
         <goals>
            <goal>flatten</goal>
         </goals>
      </execution>
   </executions>
</plugin>

Конфигурация плагина идет вparent pom.xml

${revision} заполнитель для этого. Использование задокументировано здесь:Maven CI Friendly Версии.

Корочеparent pom выглядит так (цитируется по документации Apache):

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

и ребенок пом как

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

Вы тожеhave to использоватьFlatten Maven Plugin генерировать документы pom с выделенным номером версии, включенным для развертывания. HowTo задокументирован в связанной документации.

Также @khmarbaise написал хороший пост на эту тему:Maven: POM-файлы без версии?

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

Parent POM.xml
<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mydomain</groupId>
    <artifactId>myprojectparent</artifactId>
    <packaging>pom</packaging>
    <version>${myversion}</version>
    <name>MyProjectParent</name>

    <properties>
        <myversion>0.1-SNAPSHOT</myversion>
    </properties>

    <modules>
        <module>modulefolder</module>
    </modules>
    ...
</project>
Module POM.xml
<project ...>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mydomain</groupId>
        <artifactId>myprojectmodule</artifactId>
        <version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
    </parent>

    <groupId>se.car_o_liner</groupId>
    <artifactId>vinno</artifactId>
    <packaging>war</packaging>
    <name>Vinno</name>
    <!-- Note that there's no version specified; it's inherited from parent -->
    ...
</project>

Вы можете изменитьmyversion к тому, что вы хотите, это не зарезервированное свойство.

 26 февр. 2018 г., 19:10
Я считаю, что этот вопрос может быть достоин отдельной записи, а не быть в комментарии, подобном этому. Не видя ваш код, я могу только догадываться.
 26 февр. 2018 г., 13:32
При ссылке на модуль из другого проекта Maven не разрешает свойство. Это нормально?
 30 янв. 2019 г., 08:14
@LeoLozes Вы решили свою проблему (модуль refrence из другого проекта)?
 30 янв. 2019 г., 12:10
@MortezaMalvandi да! Мой ответ внизу :)
 20 дек. 2017 г., 09:27
Скорее всего, благодаряissues.apache.org/jira/browse/MNG-2199
Решение Вопроса

EDIT: Начиная с Maven 3.5.0 есть хорошее решение для этого, используя${revision} заполнитель. УвидетьОтвет FrVaBe для деталей. Для предыдущих версий Maven см. Мой оригинальный ответ ниже.

Нет, это не так. Вы всегда должны указывать версию родителя. К счастью, это наследуется как версия модуля, что желательно в большинстве случаев. Кроме того, объявление версии этого родительского элемента автоматически изменяется плагином релиза Maven, поэтому, фактически, это не проблема, что у вас есть версия в двух местах, если вы используете плагин релиза Maven для выпуска или просто повышения версий.

Обратите внимание, что в некоторых случаях такое поведение на самом деле вполне нормально и дает больше гибкости, которая может вам понадобиться. Иногда вы хотите использовать некоторые из предыдущих родительских версий для наследования, однако это не основной случай.

 22 авг. 2018 г., 19:05
Это уже устарело - проверьте ответ @ FrVaBe здесь:stackoverflow.com/a/51969067/514483
 22 авг. 2018 г., 16:30
В настоящее время вы можете использовать${revision} заполнитель для этого. Смотри мой ответ ;-)

но для достижения этой цели существует обходной путь (возможно, с побочными эффектами, вам придется попробовать). Хитрость заключается в том, чтобы сказать дочернему проекту, чтобы найти его родителя через егоrelative path а не его чистые координаты maven, и в дополнение к экстернализации номера версии в свойстве:

Parent pom
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>

<properties>
   <!-- Unique entry point for version number management --> 
   <global.version>0.1-SNAPSHOT</global.version>
</properties>
Child pom
<parent>
   <groupId>com.dummy.bla</groupId>
   <artifactId>parent</artifactId>
   <version>${global.version}</version>
   <relativePath>..</relativePath>    
</parent>

<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>

Некоторое время я использовал этот трюк для одного из моих проектов, без особых проблем, за исключением того факта, что maven записывает много предупреждений в начале сборки, что не очень элегантно.

EDIT

Кажется, Maven 3.0.4 больше не позволяет такую конфигурацию.

 Shengjie14 мая 2012 г., 14:07
да, я боюсь, что Maven не предназначен для такой работы, лучше просто положить версии в sub pom.xml. плагин релиза maven все равно не заботится о тамошних версиях.
 17 мая 2016 г., 08:11
Я также уже давно использую это, и оно прекрасно работает (в настоящее время с maven 3.3.9) для одного многомодульного проекта. Однако, как только ваш проект становится зависимостью от другого, все становится сложнее. Я действительно предлагаю принять предложение, предложенное @pay ниже.
 10 февр. 2016 г., 14:55
Пожалуйста, будьте осторожны с этим. Это не работает, когда на ваш проект ссылается другой проект. Свойство не будет разрешено и будет обрабатываться буквально (то есть $ {my.version}). Это приведет к сбою при разрешении зависимостей.
 02 нояб. 2014 г., 11:39
Работает в 3.2.3. Расположение & lt; свойств & gt; не имеет значения. Вы получите предупреждение, хотя:'version' contains an expression but should be a constant.
 08 авг. 2013 г., 22:33
для 3.0.5 работает нормально. Вы должны указать & lt; properties & gt; хотя на самом верху.

$ mvn versions:set -DgenerateBackupPoms=false

(сделайте это в вашей папке root / parent pom).

Ваши POM проанализированы, и вас спросили, какую версию установить.

 27 февр. 2018 г., 14:26
Я думаю, что это лучший ответ, он автоматизирует изменения версий, не нарушая подпроекты (на которые вы не сможете ссылаться без родительского pom).
 23 февр. 2019 г., 15:20
Ага! Это ответ.
 21 июн. 2016 г., 00:36
Вы также можете добавить -DnewVersion = {versionToBeUpdated}, чтобы избежать его интерактивного ввода.

$ mvn release:update-versions -DdevelopmentVersion={version}

обновить номера версий в ваших POM.

Ваш ответ на вопрос