Попередження щодо використання 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>

І Мевен справді скаржиться:

[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 , вони успадкують версію від батьківської. Те, що ви зараз робите, непотрібне.


2
Просто побачивши вашу напівжирну відповідь, задокументовану тут: maven.apache.org/guides/introduction/… . Про це згадувалося в Maven: The Definitive guide, але я зачепив це під час читання. Дякую за виправлення.
whaley

13
Приклади в jira.codehaus.org/browse/MNG-4715, мабуть, мають деякі вагомі причини для використання властивості для елемента <version>, тому я не впевнений, що користі від цього немає, але +1 для нагадування нам, що у випадку, якщо ви хочете, щоб підмодулі використовували батьківську версію pom, просто видаліть тег і дайте спадщині працювати.
metamatt

7
Це нерозумно :-(. Як мені використовувати $ {buildNumber} з buildnumber-maven-plugin у версії?
Nux

6
Ні! У версії Maven 3.2.1 видаліть тег версії з дочірніх файлів Poms, що призведе до 'Помилка збірки проекту: відсутня
батьківська версія

6
@shanyangqu. Щоб тут було зрозуміло. Ви правильно сказали, що не можете видалити версію з батьківського розділу дочірньої пом. Це потрібно, щоб вказати батька, від якого ви успадковуєте. Але можна залишити і саму версію дитини. Він буде встановлений за замовчуванням для батьківської версії (версія в батьківському розділі).
drrob

2

Я можу запізнитися тут, щоб обговорити це. Я отримав просте рішення для цього WARNING.

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

Якщо немає <version>дочірнього POM, він автоматично прийме батьківський POM version.

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

Немає обмежень щодо використання майна в <version>частині батьківського або дочірнього ПОМ. Але якщо ви використовуєте свій власний тег 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.