Warnung zur Verwendung von project.parent.version als Version eines Moduls in Maven 3

79

In Maven-Projekten mit mehreren Modulen, in denen jedes Modul immer dieselbe Version wie das übergeordnete Modul behalten soll, habe ich in der pom.xml des Moduls normalerweise Folgendes ausgeführt:

  <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>

Seit ich Maven 3.0-alpha-5 benutze, erhalte ich die folgende Warnung.

[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]

Ich bin gespannt, was das eigentliche Problem beim Binden der Version eines Moduls an die übergeordnete Version ist, wenn überhaupt? Oder handelt es sich um eine allgemeine Warnung, wenn ein Ausdruck, unabhängig davon, ob es sich um project.parent.version handelt, für das Versionselement verwendet wird.

Whaley
quelle

Antworten:

91

Ich bin gespannt, was das eigentliche Problem beim Binden der Version eines Moduls an die übergeordnete Version ist, wenn überhaupt? Oder handelt es sich um eine allgemeine Warnung, wenn ein Ausdruck, unabhängig davon, ob es sich um project.parent.version handelt, für das Versionselement verwendet wird.

Nun, das wäre leicht zu testen. Weil ich neugierig war, habe ich es nur mit dem folgenden Pom für Sie getan:

<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>

Und Maven beschwert sich tatsächlich:

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

Um ehrlich zu sein, denke ich, dass Maven genau hier ist. Es macht wenig Sinn, eine Eigenschaft für das <version>Element zu verwenden (zumindest nicht für project.version), und es ist schön, wenn sich Maven darüber beschwert.

Und wenn Sie die übergeordnete POM-Version in Untermodulen verwenden möchten, entfernen Sie einfach das <version>Tag von den untergeordneten Poms . Diese erben die Version vom übergeordneten POM . Was Sie gerade tun, ist unnötig.

Pascal Thivent
quelle
2
Ich sehe nur Ihre fett gedruckte Antwort hier dokumentiert: maven.apache.org/guides/introduction/… . Es wurde so in Maven erwähnt: The Definitive Guide, aber ich habe es zu dem Zeitpunkt, als ich es las, beschönigt. Danke für die Korrektur.
Whaley
13
Die Beispiele in jira.codehaus.org/browse/MNG-4715 scheinen einige triftige Gründe für die Verwendung einer Eigenschaft für das <version> -Element zu haben, daher bin ich nicht davon überzeugt, dass dies keinen Sinn hat , sondern +1, um uns daran zu erinnern Wenn Sie möchten, dass Submodule die übergeordnete POM-Version verwenden, entfernen Sie einfach das Tag und lassen Sie die Vererbung funktionieren.
Metamatt
7
Das ist dumm :-(. Wie verwende ich $ {buildNumber} vom buildnumber-maven-plugin in der Version?
Nux
6
Nein! In Maven Version 3.2.1 entfernen Sie das Versions-Tag von den untergeordneten Poms. Dies führt zu 'Projekt-Build-Fehler: parent.version fehlt'
Junchen Liu
5
@ Shanyangqu. Nur um hier klar zu sein. Sie sagen zu Recht, dass Sie die Version nicht aus dem übergeordneten Bereich des untergeordneten POM entfernen können . Dies ist erforderlich, um das übergeordnete Element anzugeben, von dem Sie erben. Sie können jedoch die Version des Kindes selbst weglassen. Es wird standardmäßig die parent.version verwendet (die Version im übergeordneten Abschnitt).
Drrob
0

Ich könnte zu spät kommen, um darüber zu diskutieren. Ich habe eine einfache Lösung dafür WARNING.

Wenn Sie möchten, dass alle untergeordneten Module dieselbe Version wie die übergeordneten haben, entfernen Sie zunächst das <version>Tag aus dem untergeordneten POM, und wie Sie es <parent>in das untergeordnete POM aufnehmen, sollte dieses vorhanden sein.

In Abwesenheit von <version>in den Kinder POM, wird es automatisch Elternteil POM nehmen version.

Wenn Sie nun propertyin der übergeordneten POM-Version verwenden und in allen untergeordneten Modulen dasselbe erhalten möchten, können Sie wie folgt vorgehen.

Es gibt keine Einschränkung für die Verwendung von Eigenschaften in <version>Teilen des übergeordneten oder untergeordneten POM. Wenn Sie jedoch Ihr eigenes XML-Tag verwenden, um dies anzugeben, oder wenn Sie Ihre eigene Eigenschaft verwenden, wird dies WARNINGangezeigt (obwohl dies nur eine Warnung ist, funktioniert alles wie erwartet).

Wenn Sie dies jedoch beseitigen möchten WARNING, können Sie die folgenden Schritte ausführen:

  1. Erstellen Sie <properties>in POM.xml wie folgt

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. In <version>der pom.xml, setzen Sie wie folgt

    <version>${revision}</version>
    

Beispielcode-Snippet (für ein Projekt mit mehreren Modulen):

<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>

Hinweis : <revision>Wenn Sie stattdessen einen anderen Namen verwenden (z. B. <my.version>), werden Sie damit konfrontiertWARNING

Wenn Sie nun die Version während übergeben möchten mvn deploy, können Sie mvn deploy "-Drevision=1.0.0-SNAPSHOT"und ähnlich auch für verwenden mvn install.

Wenn Sie nun über der Konfiguration stehen, möchten Sie als übergeordnetes POM verwenden und dasselbe versionin allen untergeordneten Modulen verwenden. Dies kann auch durchgeführt werden. In jedem child module POMverwenden unten

<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>

Als Referenz können Sie das Maven-Multi-Modul-Setup durchlaufen

S.MANDAL
quelle