Ostrzeżenie dotyczące używania project.parent.version jako wersji modułu w Maven 3

80

W projektach wielomodułowych maven, w których chcę, aby każdy z modułów zawsze zachowywał tę samą wersję co rodzic, zwykle robiłem coś takiego w pom.xml modułu:

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

Odkąd zacząłem używać maven 3.0-alpha-5, otrzymuję następujące ostrzeżenie.

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

Jestem ciekawy, jaki jest prawdziwy problem z wiązaniem wersji modułu z wersją nadrzędną, jeśli w ogóle? Czy jest to przypadek ogólnego ostrzeżenia, gdy dowolne wyrażenie, niezależnie od tego, czy jest to project.parent.version, jest używane w elemencie version.

whaley
źródło

Odpowiedzi:

91

Jestem ciekawy, jaki jest prawdziwy problem z wiązaniem wersji modułu z wersją nadrzędną, jeśli w ogóle? Czy jest to przypadek ogólnego ostrzeżenia, gdy dowolne wyrażenie, niezależnie od tego, czy jest to project.parent.version, jest używane w elemencie version.

Cóż, byłoby to łatwe do przetestowania. Ponieważ byłem ciekawy, po prostu zrobiłem to dla Ciebie za pomocą następującego pom:

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

A maven rzeczywiście narzeka:

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

Szczerze mówiąc, myślę, że maven jest tutaj, nie ma sensu używać właściwości dla <version>elementu (przynajmniej nie dla project.version) i miło jest, gdy maven narzeka na to.

A jeśli chcesz użyć macierzystej wersji pom w podmodułach, po prostu usuń <version>tag z podrzędnych pomów , odziedziczą one wersję po rodzicu. To, co obecnie robisz, jest niepotrzebne.

Pascal Thivent
źródło
2
Widzę tylko udokumentowaną Twoją pogrubioną odpowiedź tutaj: maven.apache.org/guides/introduction/… . Wspomniano o tym w przewodniku Maven: The Definitive, ale pominąłem to w czasie, gdy go czytałem. Dziękuję za poprawienie mnie.
whaley
13
Przykłady w jira.codehaus.org/browse/MNG-4715 wydają się mieć kilka ważnych powodów do używania właściwości dla elementu <version>, więc nie jestem przekonany, że nie ma to sensu, ale +1, aby nam o tym przypomnieć w przypadku, gdy chcesz, aby moduły podrzędne używały wersji nadrzędnej pom, po prostu usuń znacznik i pozwól dziedziczeniu działać.
metamatt
7
To głupie :-(. Jak używać $ {buildNumber} z buildnumber-maven-plugin w wersji?
Nux
6
Nie! W Maven w wersji 3.2.1 usuń tag wersji z pomów podrzędnych, co spowoduje „błąd kompilacji projektu: brak wersji
nadrzędnej
6
@shanyangqu. Żeby było jasne tutaj. Masz rację, mówiąc, że nie możesz usunąć wersji z sekcji nadrzędnej dziecięcego pom. Jest to potrzebne do określenia rodzica, po którym dziedziczenie. Ale może opuścić wersję samego dziecka. Domyślnie będzie to parent.version (wersja w sekcji nadrzędnej).
drrob
2

Mogę się tu spóźnić, żeby o tym porozmawiać. Mam na to proste rozwiązanie WARNING.

Przede wszystkim, jeśli chcesz, aby wszystkie moduły potomne miały tę samą wersję co rodzic, po prostu usuwasz <version>tag z podrzędnego POM i, gdy <parent>dołączasz do podrzędnego POM, to powinno tam być.

W przypadku braku <version>w dziecku POM, automatycznie przejmie Parent POM version.

Teraz, jeśli chcesz użyć propertyw nadrzędnej wersji POM i chcesz uzyskać to samo we wszystkich modułach podrzędnych, możesz wykonać następujące czynności.

Nie ma ograniczeń co do korzystania z własności w <version>części POM rodzica lub dziecka. Ale jeśli użyjesz własnego tagu xml do określenia tego lub użyjesz własnej właściwości, wtedy WARNINGpojawi się (chociaż jest to tylko ostrzeżenie, wszystko działa zgodnie z oczekiwaniami).

Ale jeśli chcesz się tego pozbyć WARNING, możesz wykonać następujące kroki:

  1. Utwórz <properties>wewnątrz POM.xml, jak poniżej

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. W <version>POM.xml umieść jak następuje

    <version>${revision}</version>
    

Przykładowy fragment kodu (dla projektu wielomodułowego):

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

Uwaga : zamiast tego <revision>, jeśli użyjesz innego imienia (na przykład <my.version>), staniesz przed tymWARNING

Teraz, jeśli chcesz przekazać wersję w trakcie mvn deploy, możesz użyć mvn deploy "-Drevision=1.0.0-SNAPSHOT"i podobnie do mvn installrównież.

Teraz, jeśli powyższa konfiguracja, chcesz użyć jako nadrzędnego POM i chcesz użyć tego samego versionwe wszystkich modułach potomnych, to również można to zrobić. W każdym przypadku child module POMużyj poniżej

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

W celach informacyjnych możesz przejść przez konfigurację wielu modułów Maven

S.MANDAL
źródło