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

У меня есть два проекта: Родительский проект: A, Sub project: B

А/pom.xml:

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Родительский 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>

Ребенок 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 записывает много предупреждений в начале сборки, что не очень элегантно.

ИЗМЕНИТЬ

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

Ответ 3

Самый простой способ обновления версий IMO:

$ mvn versions:set -DgenerateBackupPoms=false

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

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

Ответ 4

Вы также можете использовать:

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

для обновления номеров версий в POM.

Ответ 5

Как упоминал Янфлеа, есть способ обойти это.

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

Родительский 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>

Модуль 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 no version specified; it inherited from parent -->
    ...
</project>

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

Ответ 6

С Maven 3.5.0 вы можете использовать заполнитель ${revision} для этого. Использование описано здесь: Maven CI Friendly Versions.

Короче говоря, родительский 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>

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

Кроме того, @khmarbaise написал приятный пост блоба об этой функции: Maven: POM файлы без версии в нем?

Ответ 7

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

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

Единственный вариант, я изменил в съемном определения является 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>

Конфигурация подключаемого модуля находится в родительском pom.xml