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

141

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

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

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

jira.codehaus.org/browse/MNG-624 Timur
возможный дубликатCan you inherit the version from the parent POM in Maven? blong
Ссылка выше перемещена. Окончательный статус был «Закрыт / Не исправлен».issues.apache.org/jira/browse/MNG-624 jocull
Боюсь, вам придется дождаться Maven 3.1. Perception

Ваш Ответ

7   ответов
79

но для достижения этой цели существует обходной путь (возможно, с побочными эффектами, вам придется попробовать). Хитрость заключается в том, чтобы сказать дочернему проекту, чтобы найти его родителя через его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 больше не позволяет такую конфигурацию.

да, я боюсь, что Maven не предназначен для такой работы, лучше просто положить версии в sub pom.xml. плагин релиза maven все равно не заботится о тамошних версиях. Shengjie
Пожалуйста, будьте осторожны с этим. Это не работает, когда на ваш проект ссылается другой проект. Свойство не будет разрешено и будет обрабатываться буквально (то есть $ {my.version}). Это приведет к сбою при разрешении зависимостей.
Я также уже давно использую это, и оно прекрасно работает (в настоящее время с maven 3.3.9) для одного многомодульного проекта. Однако, как только ваш проект становится зависимостью от другого, все становится сложнее. Я действительно предлагаю принять предложение, предложенное @pay ниже.
Работает в 3.2.3. Расположение & lt; свойств & gt; не имеет значения. Вы получите предупреждение, хотя:'version' contains an expression but should be a constant.
для 3.0.5 работает нормально. Вы должны указать & lt; properties & gt; хотя на самом верху.
69

$ mvn versions:set -DgenerateBackupPoms=false

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

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

Вы также можете добавить -DnewVersion = {versionToBeUpdated}, чтобы избежать его интерактивного ввода.
Я думаю, что это лучший ответ, он автоматизирует изменения версий, не нарушая подпроекты (на которые вы не сможете ссылаться без родительского pom).
Ага! Это ответ.
16

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

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

6

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

21

${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-файлы без версии?

18

В мавене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 к тому, что вы хотите, это не зарезервированное свойство.

Я считаю, что этот вопрос может быть достоин отдельной записи, а не быть в комментарии, подобном этому. Не видя ваш код, я могу только догадываться.
@MortezaMalvandi да! Мой ответ внизу :)
При ссылке на модуль из другого проекта Maven не разрешает свойство. Это нормально?
@LeoLozes Вы решили свою проблему (модуль refrence из другого проекта)?
Скорее всего, благодаряissues.apache.org/jira/browse/MNG-2199
58

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

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

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

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

Похожие вопросы