Предупреждение об использовании project.parent.version в качестве версии модуля в Maven 3

80

В многомодульных проектах maven, где я хочу, чтобы каждый из модулей всегда сохранял ту же версию, что и родительский, я обычно делал что-то вроде следующего в модуле pom.xml:

  <parent>
    <groupId>com.groupId</groupId>
    <artifactId>parentArtifactId</artifactId>
    <version>1.1-SNAPSHOT</version>
  </parent>

  <groupId>com.groupId</groupId>
  <artifactId>artifactId</artifactId>
  <packaging>jar</packaging>
  <version>${project.parent.version}</version>
  <name>name</name>

Поскольку я начал использовать maven 3.0-alpha-5, я получаю следующее предупреждение.

[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.groupid.artifactId:name:jar:1.1-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.groupid.artifactId:name::${project.parent.version}, /Users/whaley/path/to/project/child/pom.xml
[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]

Мне любопытно узнать, в чем настоящая проблема с привязкой версии модуля к родительской версии, если таковая имеется? Или это случай общего предупреждения, когда любое выражение, независимо от того, является ли оно project.parent.version, используется для элемента версии.

кит
источник

Ответы:

91

Мне любопытно узнать, в чем настоящая проблема с привязкой версии модуля к родительской версии, если таковая имеется? Или это случай общего предупреждения, когда любое выражение, независимо от того, является ли оно project.parent.version, используется для элемента версии.

Что ж, это легко проверить. Поскольку мне было любопытно, я просто сделал это для вас, используя следующий помпон:

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>parent</artifactId>
    <groupId>com.mycompany</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>com.mycompany</groupId>
  <artifactId>module</artifactId>
  <version>${myversion}</version>
  <name>module</name>
  <url>http://maven.apache.org</url>
  <properties>
    <myversion>1.0-SNAPSHOT</myversion>
  </properties>
  ...
</project>

И maven действительно жалуется:

[WARNING] 'version' contains an expression but should be a constant. @ com.mycompany:module:${myversion}, /home/pascal/Projects/maven-maven3-testcase/module/pom.xml

Честно говоря, я думаю, что здесь maven, нет смысла использовать свойство для <version> элемента (по крайней мере, для project.version), и приятно, когда maven жалуется на это.

И если вы хотите использовать родительскую версию pom в подмодулях, просто удалите <version>тег из дочерних poms , они унаследуют версию от родителя. То, что вы сейчас делаете, не нужно.

Pascal Thivent
источник
2
Просто посмотрите, как здесь задокументирован ваш жирный ответ: maven.apache.org/guides/introduction/… . Это было упомянуто в Maven: The Definitive guide, но я умалчал об этом, когда читал его. Спасибо за исправление.
Whaley
13
Примеры в jira.codehaus.org/browse/MNG-4715, похоже, имеют веские причины для использования свойства для элемента <version>, поэтому я не уверен, что это бесполезно, но +1 для напоминания нам, что в случае, если вы хотите, чтобы подмодули использовали родительскую версию pom, просто удалите тег и позвольте наследованию работать.
metamatt 08
7
Это глупо :-(. Как мне использовать $ {buildNumber} из buildnumber-maven-plugin в версии?
Nux,
6
Нет! В Maven версии 3.2.1 удалите тег версии из дочерних poms, в результате появится «ошибка сборки проекта: родительская версия отсутствует»
Джунчэн Лю
6
@shanyangqu. Просто чтобы прояснить здесь. Вы правы, говоря, что вы не можете удалить версию из родительского раздела дочернего pom. Это необходимо для указания родителя, от которого вы наследуете. Но вы можете опустить версию самого ребенка. По умолчанию будет использоваться parent.version (версия в родительском разделе).
drrob 07
2

Я мог бы опоздать сюда, чтобы обсудить это. У меня для этого есть простое решение WARNING.

Прежде всего, если вы хотите, чтобы все дочерние модули принимали ту же версию, что и родительские, вы просто удаляете <version>тег из дочернего POM и, когда вы включаете <parent>дочерний POM, он должен быть там.

При отсутствии <version>дочернего POM он автоматически принимает родительский POM version.

Теперь, если вы хотите использовать propertyродительскую версию POM и хотите получить то же самое во всех дочерних модулях, вы можете выполнить следующие действия.

Нет ограничений на использование свойства в <version>родительском или дочернем POM. Но если вы используете свой собственный тег xml для указания этого или используете собственное свойство, тогда WARNINGприходит (хотя это всего лишь предупреждение, все работает, как ожидалось).

Но если вы хотите избавиться от этого WARNING , вы можете выполнить следующие действия:

  1. Создайте <properties>внутри POM.xml, как показано ниже

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. В <version>POM.xml введите следующее

    <version>${revision}</version>
    

Пример фрагмента кода (для многомодульного проекта):

<groupId>abc.xyz</groupId>
<artifactId>pqr</artifactId>
<!-- <version>1.0.0</version> -->
<version>${revision}</version>
<packaging>pom</packaging>
<description>Parent POM</description>

<properties>
    <revision>1.0.0</revision>
</properties>

Запись : вместо того <revision>, чтобы использовать любое другое имя (например, <my.version>), вы столкнетесь с этимWARNING

Теперь, если вы хотите пройти версию во время mvn deploy , вы можете использовать mvn deploy "-Drevision=1.0.0-SNAPSHOT"и аналогично для mvn install.

Теперь, если указанная выше конфигурация, вы хотите использовать как родительский POM, и вы хотите использовать то же самое versionво всех дочерних модулях, это также можно сделать. В каждомchild module POM используйте ниже

<parent>
    <groupId>abc.xyz</groupId>
    <artifactId>Parent</artifactId>
    <!-- <version>1.0.0</version> -->
    <version>${revision}</version>
</parent>

<groupId>abc.xyz</groupId>
<artifactId>Child</artifactId>
<!-- <version>1.0.0</version> -->     <!-- Automatically inherit parent POM version -->
<name>Demo</name>

Для справки вы можете пройти настройку нескольких модулей maven

S.MANDAL
источник