web-dev-qa-db-de.com

Wie kann ich eine Eigenschaft in einem Maven-POM aktualisieren?

Ich habe zwei Top-Level-Maven-Projekte, backend und frontend, die Versionen in ihrem eigenen Tempo vorrücken. Da jedes über mehrere Module verfügt, definiere ich meine Abhängigkeitsversionen in dependencyManagement-Abschnitten in den übergeordneten/aggregierten POMs und verwende eine Eigenschaft für die Versionsnummer.

Ich möchte die Eigenschaft sauber mit der Versionsnummer auf frontend aktualisieren, vorzugsweise willkürlich, aber ich kann davon ausgehen, dass eine Live-Upstream-Version erforderlich ist. Ich habe versucht, versions:update-property zu verwenden, aber dieses Ziel scheint völlig funktionslos zu sein. Unabhängig davon, ob es tatsächlich eine passende Upstream-Version gibt, bekomme ich diese Debug-Ausgabe:

$ mvn versions:update-property -Dproperty=frontend.version -DnewVersion=0.13.2  -DautoLinkItems=false -X
...
[DEBUG] Searching for properties associated with builders
[DEBUG] Property ${frontend.version}
[DEBUG] Property ${frontend.version}: Looks like this property is not associated with any dependency...
[DEBUG] Property ${frontend.version}: Set of valid available versions is [0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.13.2, 0.13.3]
[DEBUG] Property ${frontend.version}: Restricting results to 0.13.2
[DEBUG] Property ${frontend.version}: Current winner is: null
[DEBUG] Property ${frontend.version}: Searching reactor for a valid version...
[DEBUG] Property ${frontend.version}: Set of valid available versions from the reactor is []
[INFO] Property ${frontend.version}: Leaving unchanged as 0.13.1
[INFO] ------------------------------------------------------------------------

Ich habe -DautoLinkItems=false angegeben, und dies scheint keine Auswirkung zu haben. versions-maven-plugin durchsucht immer noch alle meine POMs nach übereinstimmenden Abhängigkeiten, legt ihre Hände hoch und beendet den Vorgang. Ich habe auch versucht, searchReactor für diese Eigenschaft in der Plug-In-Konfiguration auf false zu setzen. Es scheint, dass das Plugin (1) die Abhängigkeiten falsch scannt, selbst wenn ich ausdrücklich gesagt habe, sie zu ignorieren, und (2) sogar eine explizite spezifische Übereinstimmung herausfiltert.

Gibt es eine einfache Möglichkeit, einen Maven-Eigenschaftseintrag auf einen bestimmten Wert umzuschreiben, indem er versions-maven-plugin zwingt, das zu tun, was ich sage, ohne eine Versionsnummer zu überprüfen oder ein anderes Ziel zu verwenden? Ich würde es vorziehen, ein Tool wie sed zu vermeiden, das XML nicht versteht (wie ich es in einer ähnlichen Frage empfohlen habe), aber ich wäre mit einer einfachen XPath-Manipulation in Ordnung.

22
chrylis

Der newVersion-Parameter ist (wie die meisten dieses Plugins) schlecht dokumentiert. Bei der Überprüfung der Integrationstests sehe ich einen Maven-Versionsbereich keine einfache Versionsnummer. Außerdem können Sie keinen Wert angeben - es muss ein gültiger Wert sein, den Maven auflösen kann. Der Parameter wäre besser, wenn er constrainRange heißt.

Versuchen Sie Folgendes für alle anderen:

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2]  

Wenn Sie ein Snapshot aktualisieren müssen, müssen Sie die Eigenschaft allowSnapshots auf true setzen

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] -DallowSnapshots=true
12
drekbour

Gibt es eine einfache Möglichkeit, einen Maven-Eigenschaftseintrag auf einen bestimmten Wert umzuschreiben

Seit Version 2.5 können wir set-property ( documentation ) verwenden:

mvn versions:set-property -Dproperty=your.property -DnewVersion=arbitrary_value

Wie dokumentiert führt das set-property-Ziel keine Überprüfung der von Ihnen angegebenen Werte durch. Daher sollte es immer funktionieren, aber Sie sollten es mit Vorsicht verwenden.

11
George Aristy

So aktualisieren Sie eine Eigenschaft in einem vorhandenen POM:

Versuchen Sie die Filterung in maven-resource-plugin :

  1. version in Eigenschaftendatei angeben; 
  2. fügen Sie dieser Datei einen benutzerdefinierten Filter mit Pfad hinzu (in Kind pom.xml, in das die Abhängigkeit eingefügt werden soll);
  3. update-Version in der Eigenschaftsdatei;
  4. build ausführen.

Vorteile: 

  • es sollte funktionieren; 
  • version wird nur einmal angegeben;
  • eigenschaftendatei kann unter Versionskontrolle hinzugefügt werden;
  • prozessressourcen ist einer der ersten Lebenszyklusschritte von Maven.

Nachteile:

  • nun, pom.xml verwendet weiterhin Platzhalter;
  • zusätzliche Arbeit zum automatischen Aktualisieren der Eigenschaftendatei vom ursprünglichen Build (zu kompliziert, ich denke, es sollte eine einfache Lösung geben).

Wie man Propery auf Bauzeit zur Verfügung stellt:

Sie können jede Eigenschaft über den Build-Parameter angeben.

Ich habe zum Beispiel eine Eigenschaft in pom.xml wie:

<properties>
    <build.date>TODAY</build.date>
</properties>

Um es während des Builds zu ändern, benutze ich einfach den Parameter:

mvn compile -Dbuild.date=10.10.2010

Ich bin mir ziemlich sicher, dass es auch für die Version funktionieren wird. Eigenschaften von Projekten auf oberster Ebene werden auch von untergeordneten Elementen übernommen.

3
arghtype

Ich hatte das gleiche Problem und fand nichts, was die Eigenschaften von pom in der Datei ändert.

cat pom.xml | sed -e "s%<util.version>0.0.1-SNAPSHOT</util.version>%<util.version>$bamboo_planRepository_branch</util.version>%" > pom.xml.transformed;
rm pom.xml;
mv pom.xml.transformed pom.xml;
2
mojoo-de

Folgendes gilt für Versionen: Update-Properties-Ziel. Ich denke, dasselbe gilt für Versionen: update-property.

Das Ziel funktioniert standardmäßig nur, wenn eine entsprechende Eigenschaftsdefinition und Abhängigkeitsdeklaration in derselben POM-Datei enthalten sind.

Wenn die Eigenschaft beispielsweise in einem Projekt-POM definiert ist, aber in einer Abhängigkeitsdeklaration in einem Modul-POM verwendet wird, ist im Projekt-POM die folgende Konfiguration für die automatische Aktualisierung über das Versions-Plug-In erforderlich.

  <properties>
    <my.version>3.7.11</my.version>
  </properties>
...

  <build>
    <plugins>
      <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>versions-maven-plugin</artifactId>
         <version>2.2</version>
         <configuration>
           <properties>
            <property>
              <name>my.version</name>
              <dependencies>
                <dependency>
                  <groupId>com.acme.test</groupId>
                  <artifactId>demo-arti</artifactId>
                </dependency>
              </dependencies>
            </property>
          </properties>
        </configuration>
      </plugin>
    </plugins>
  </build>

Die Plugin-Konfiguration wird wirksam, wenn das Versions-Maven-Plugin für POM ausgeführt wird und versucht, die Eigenschaft zu aktualisieren. Die Konfiguration teilt dem Versions-Plugin mit, dass die Eigenschaft für die angegebene Abhängigkeit "in einem POM irgendwo" verwendet wird, auch wenn dies im aktuellen POM nicht der Fall ist.

0
Darren Yeats

Wenn Sie Ihre Eigenschaft in der Datei pom.xml definieren, müssen Sie sie als Intervall angeben, wenn die Update-Eigenschaft funktionieren soll.

Ich meine, Ihre Frontend-Version ist wie folgt definiert:

<frontend.version>0.13.1</frontend.version>

Das Plugin erkennt dann den Wert nicht als gültigen Wert, wenn Sie -DnewVersion = 0.13.2 setzen. Anstatt, wenn Sie als Intervall definieren, funktioniert das Plugin.

<frontend.version>[0.13.0,0.13.2]</frontend.version>

In einem meiner Tests bekomme ich folgendes Ergebnis:

mvn versions:update-property -Dproperty=absis.version -DnewVersion=[2.20.4] -X


    [DEBUG] Property ${test.version}: Set of valid available versions is [2.19.0-RC-REVISION-1, 2.19.0-RC0.1, 2.19.0-RC0.2, 2.19.0-RC0.3, 2.19.0-RC0.4, 2.19.0-RC0.5, 2.19.0-RC0.6, 2.19.0-RC0.7, 2.19.0-RC1, 2.19.0-RC2, 2.19.0-RC3, 2.19.0, 2.19.0-revision, 2.19.0-revision2, 2.19.0.2, 2.19.1, 2.19.2, 2.19.3, 2.19.4, 2.20.0-RC0, 2.20.0-RC0.1, 2.20.0-RC1, 2.20.0-RC2, 2.20.0-RC3, 2.20.0, 2.20.0-PRUEBA-VERSION, 2.20.0-PRUEBA-VERSION-2, 2.20.0-PRUEBA-VERSION-3, 2.20.0i-RC1, 2.20.0i-RC1.1, 2.20.0i, 2.20.0i.2, 2.20.1, 2.20.2, 2.20.4, 2.20.5, 2.20.5-LT, 2.20.5.1, 2.20.6i-RC1, 2.21.0-RCtest1, 2.21.0-RCtest2]
[DEBUG] Property ${test.version}: Restricting results to [2.20.4,2.20.4]
[DEBUG] Property ${test.version}: Current winner is: 2.20.4
[DEBUG] Property ${test.version}: Searching reactor for a valid version...
[DEBUG] Property ${test.version}: Set of valid available versions from the reactor is []
[INFO] Updated ${test.version} from [2.19.0,2.21.0-SNAPSHOT] to 2.20.4

Kaufen Sie müssen Sie den Eigenschaftswert in einen Bereich ändern. 

Es ist eine Schande, weil ich den Bereich nicht in meiner Poms-Definition verwenden kann.