Maven-Version mit einer Eigenschaft

Lesezeit: 9 Minuten

Benutzeravatar von Jan Pešta
Jan Pešta

Ich habe ein großes Maven (Tycho)-Projekt mit etwa 400 Plug-Ins.

Wir haben die Version der Anwendung in jeder POM-Datei angegeben.

Gibt es eine Möglichkeit, die Version für alle POM:s nur an einer Stelle anzugeben?

Ich würde erwarten, dass einige denken wie:

<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>

....

<version>${buildVersion}</version>

Wir haben Eltern pom.xml:

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>pom</packaging>

Dann ist in jedem POM ein Verweis auf das übergeordnete POM:

<parent>
  <artifactId>build.parent</artifactId>
  <groupId>company</groupId>
  <relativePath>../build.parent/pom.xml</relativePath>
  <version>1.1.2-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>

Benutzeravatar von Frederic Close
Friedrich Close

Wenn Sie ein übergeordnetes Projekt haben, können Sie die Version im übergeordneten pom festlegen und in den untergeordneten Projekten können Sie mit der auf Geschwisterbibliotheken verweisen ${Projekt.Version} oder ${version} Eigenschaften.

Wenn Sie vermeiden möchten, die Version des Elternteils in jedem Kind zu wiederholen: Sie können dies tun:

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>

<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>

Und dann müssen Sie in Ihrem Kinder-Pom Folgendes tun:

    <parent>
      <artifactId>build.parent</artifactId>
      <groupId>company</groupId>
      <relativePath>../build.parent/pom.xml</relativePath>
      <version>${my.version}</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>company</groupId>
    <artifactId>artifact</artifactId>
    <packaging>eclipse-plugin</packaging>

    <dependencies>
        <dependency> 
           <groupId>company</groupId>
           <artifactId>otherartifact</artifactId>   
           <version>${my.version}</version>
or
           <version>${project.version}</version>
        </dependency>
    </dependencies>

hth

  • Derzeit habe ich einen übergeordneten Pom, aber ich muss dort eine Version haben, was bedeutet, dass jeder Pom eine bestimmte Version des übergeordneten Pom hat.

    – Jan Pešta

    2. Oktober 2013 um 8:38 Uhr

  • [WARNING] Beim Erstellen des effektiven Modells für company:group1:pom:1.1.2-SNAPSHOT sind einige Probleme aufgetreten [WARNING] ‘Version’ enthält einen Ausdruck, sollte aber eine Konstante sein. @ company:maven-test:${my.version}, [WARNING] [WARNING] Es wird dringend empfohlen, diese Probleme zu beheben, da sie die Stabilität Ihres Builds gefährden. [WARNING] [WARNING] Aus diesem Grund unterstützen zukünftige Maven-Versionen das Erstellen solcher fehlerhafter Projekte möglicherweise nicht mehr.

    – Jan Pešta

    2. Oktober 2013 um 21:15 Uhr


  • Mit der neuen Version von Maven wird diese Funktion nicht mehr funktionieren!

    – Jalousien

    20. März 2018 um 11:55 Uhr

  • Es hat bei mir mit Maven 3.5.4 funktioniert, beachten Sie, dass weder 3.5.2 noch 3.6.0 funktioniert haben.

    – Searene

    7. März 2019 um 6:12 Uhr

  • Befolgen Sie besser die anderen Antworten mit mvn versions:set – die Menge an Ärger, die Sie mit Versionen als Eigenschaften haben werden, ist es einfach nicht wert

    – Bart Robeyns

    27. Februar 2021 um 16:59 Uhr

Benutzeravatar von ACV
ACV

Die richtige Antwort ist diese (Beispielversion):

  • In der übergeordneten pom.xml sollten Sie (nicht Innerhalb properties):

    <version>0.0.1-SNAPSHOT</version>
    
  • In allen untergeordneten Modulen sollten Sie Folgendes haben:

    <parent>
        <groupId>com.vvirlan</groupId>
        <artifactId>grafiti</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    

Es ist also fest codiert.

Um nun die Version zu aktualisieren, gehen Sie wie folgt vor:

mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
mvn versions:commit # Necessary to remove the backup file pom.xml

und alle Ihre 400 Module haben die übergeordnete Version aktualisiert.

  • Und dies hat die pom.xml-Dateien geändert, was bedeutet, dass der nachfolgende Build aus geändertem Quellcode erfolgt, was ich anstößig finde.

    – Bob Glocke

    13. März 2019 um 19:22 Uhr

  • @BobBell Es ist nicht möglich, die Version zu aktualisieren, ohne pom-Dateien zu ändern.

    – ACV

    5. September 2019 um 15:57 Uhr

  • @ACV Das stimmt nicht. Sie können mit einer alternativen Version von Ihnen bauen ${revision} und passieren -Drevision auf der Kommandozeile.

    – Bob Glocke

    6. September 2019 um 17:54 Uhr

  • @BobBell , ich passiere nur die Befehlszeile, aber im Ordner .m2 wird pom nicht mit dem Platzhalterwert aktualisiert. könnten Sie mir bitte helfen, dieses Problem zu lösen

    – Entw

    4. November 2020 um 6:40 Uhr

  • @Dev Benutzt du -Drevisionoder -DnewVersion? Über die Befehlszeile können nur begrenzte Eigenschaften aktualisiert werden. Sehen maven.apache.org/maven-ci-friendly.html

    – Bob Glocke

    5. November 2020 um 18:43 Uhr

Die Verwendung einer Eigenschaft für die Version generiert die folgende Warnung:

[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[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]

Wenn Ihr Problem darin besteht, dass Sie die Version an mehreren Stellen ändern müssen, weil Sie die Version wechseln, dann ist es richtig, das Maven Release Plugin zu verwenden, das dies automatisch für Sie erledigt.

  • Können Sie erklären, wie das Maven-Release-Plugin dieses Problem behebt?

    – Basilikum Musa

    14. Dezember 2015 um 19:35 Uhr

  • Nun, es behebt das gemeldete Problem tatsächlich nicht, da dies nicht der richtige Weg ist, also sollten Sie die Version Ihres Projekts nicht in einer Eigenschaft festlegen. Wenn Ihr Projekt mehrere Module hat, dann ist es das Richtige, das Release-Plug-in die Arbeit des Änderns der Version in allen pom.xml-Dateien für Sie erledigen zu lassen.

    – Constantino Cronemberger

    16. Dezember 2015 um 10:38 Uhr

  • Ich würde sagen, dass die Verwendung des Maven-Release-Plugins der richtige Weg ist. In unserem Fall verwenden wir den Befehl update POM, um die Version aller Module wie folgt auf das übergeordnete Modul zu setzen: mvn release:update-versions -DautoVersionSubmodules=true

    – Mihkel Selgal

    4. Mai 2016 um 7:58 Uhr

  • Dies beinhaltet die Modifikation des POM, was bedeutet, dass eine quellcodegesteuerte Datei jetzt modifiziert wird, was ich verwerflich finde.

    – Bob Glocke

    13. März 2019 um 20:00 Uhr

  • Ziel ist es, die Version zu ändern. Die Diskussion hier ist, ob dies an einem einzigen Ort durchgeführt werden kann oder nicht.

    – Constantino Cronemberger

    14. März 2019 um 10:50 Uhr

Siehe die Maven – Benutzer Forum ‘Version’ enthält einen Ausdruck, sollte aber eine Konstante sein. Bessere Möglichkeit, eine neue Version hinzuzufügen?:

Hier ist, warum dies ein schlechter Plan ist.

Bei dem bereitgestellten Pom wird der Eigenschaftswert nicht aufgelöst, sodass jeder, der von diesem Pom abhängt, die Abhängigkeit als die mit ${ } nicht interpolierte Zeichenfolge erkennt, und viel Heiterkeit wird in Ihrem Build-Prozess entstehen.

in Maven 2.1.0 und/oder 2.2.0 wurde versucht, Poms mit aufgelösten Eigenschaften bereitzustellen … dies brach mehr als erwartet, weshalb diese beiden Versionen nicht empfohlen werden, da 2.2.1 die empfohlene 2.x-Version ist .

Benutzeravatar von Kariem
Kariem

Mit einer Maven-Version von 3.5 oder höher sollten Sie in der Lage sein, einen Platzhalter (z ${revision}) im übergeordneten Abschnitt und im Rest des POM können Sie verwenden ${project.version}.

Tatsächlich können Sie GAV-Eigenschaften auch außerhalb von weglassen <parent> die gleich sind, da sie vererbt werden. Das Ergebnis würde in etwa so aussehen:

<project>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>build.parent</artifactId>
        <groupId>company</groupId>
        <version>${revision}</version>  <!-- use placeholder -->
        <relativePath>../build.parent</relativePath>
    </parent>

    <artifactId>artifact</artifactId>
    <!-- no 'version', no 'groupId'; inherited from parent -->
    <packaging>eclipse-plugin</packaging>

    ...
</project>

Weitere Informationen, insbesondere zum Auflösen des Platzhalters während der Veröffentlichung, finden Sie unter Maven CI-freundliche Versionen | Einrichtung mehrerer Module.

  • Dies erzeugt Warnungen und fordert die Verwendung einer konstanten Version auf, hängt jedoch immer noch davon ab

    – Davut Gürbüz

    30. Januar 2019 um 14:56 Uhr

  • @DavutGürbüz Es funktioniert hier nicht (mit Maven 3.6.0 und wenn Sie den Anweisungen auf der verlinkten Seite folgen Maven CI-freundliche Versionen).

    – Gerold Broser

    27. März 2019 um 16:29 Uhr

Benutzeravatar von rince
spülen

Wenn Sie Maven 3 verwenden, besteht eine Möglichkeit, dieses Problem zu umgehen, darin, das Versions-Plugin zu verwenden
http://www.mojohaus.org/versions-maven-plugin/

Insbesondere die Befehle,

mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit

Dadurch werden die übergeordneten und untergeordneten Poms auf 2.0-RELEASE aktualisiert. Sie können dies zuvor als Build-Schritt ausführen.

Im Gegensatz zum Release-Plugin versucht es nicht, mit Ihrer Quellcodeverwaltung zu kommunizieren

  • Dies erzeugt Warnungen und fordert die Verwendung einer konstanten Version auf, hängt jedoch immer noch davon ab

    – Davut Gürbüz

    30. Januar 2019 um 14:56 Uhr

  • @DavutGürbüz Es funktioniert hier nicht (mit Maven 3.6.0 und wenn Sie den Anweisungen auf der verlinkten Seite folgen Maven CI-freundliche Versionen).

    – Gerold Broser

    27. März 2019 um 16:29 Uhr

Ich habe das Problem so erfolgreich gelöst:

In der übergeordneten pom.xml habe ich die Version wie gewohnt gesited (nicht innerhalb von Eigenschaften):

<version>0.0.1-SNAPSHOT</version>

In allen untergeordneten Modulen habe ich verwendet:

<parent>
   <groupId>com.example</groupId>
   <artifactId>parent-module</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</parent>

Dann habe ich den Elternteil geändert in:

<version>0.0.2-SNAPSHOT</version>

Um nun die Version zu aktualisieren, die ich in der Befehlszeile ausgeführt habe:

mvn -N versions:update-child-modules

Die untergeordneten Elemente wurden automatisch aktualisiert auf:

<parent>
   <groupId>com.example</groupId>
   <artifactId>parent-module</artifactId>
   <version>0.0.2-SNAPSHOT</version>
</parent>

Mit anderen Worten, ich habe die verwendet versions:update-child-modules Ziel.

Ich habe diese Lösung gefunden hier.

1435990cookie-checkMaven-Version mit einer Eigenschaft

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy