Zuvor habe ich eine Frage zum Ändern der Maven-Projektversion über die Befehlszeile gestellt, die mich zu einem neuen Problem führte.
Zuvor konnte ich die Versionsnummer abrufen, da die Version als eine Eigenschaft gespeichert wurde, die einfach über die Befehlszeile (Bash) zu erfassen und zu analysieren war. Nachdem das Element pom.xml dafür verwendet wird, ist es nicht mehr eindeutig, da alle Abhängigkeiten und möglicherweise auch einige andere dies verwenden. Ich denke, es gibt keine Möglichkeit, die aktuelle Versionsnummer mit einem Bash-Skript ohne externe Tools zum Parsen von XML oder einen sehr kontextsensitiven sed-Befehl abzurufen.
Die sauberste Lösung meiner Meinung nach wäre, dass Maven diese Versionsinformationen verteilt. Ich dachte daran, ein benutzerdefiniertes Maven-Plugin zum Abrufen verschiedener Eigenschaften zu schreiben, dachte aber, ich würde hier zuerst nachfragen.
Gibt es eine einfache Möglichkeit, den Wert von ${project.version}
auf die Befehlszeile zu übertragen? Danke im Voraus.
Lösung
Danke für die Hilfe. Ich musste cd
manuell in das Verzeichnis, aber das kann leicht gemacht werden. In meinem Bash-Skript habe ich
version=`cd $project_loc && mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | sed -n -e '/^\[.*\]/ !{ /^[0-9]/ { p; q } }'`
Das gibt mir die aktuelle Version, die ich dann weiterentwickeln kann. Grepping mag einfacher sein, aber ich dachte, ich möchte so robust wie möglich sein, also bin ich mit der ersten Zeile, die mit einer Nummer beginnt, zufrieden und versuche, diese als Versionsnummer zu behandeln.
# Advances the last number of the given version string by one.
function advance_version () {
local v=$1
# Get the last number. First remove any suffixes (such as '-SNAPSHOT').
local cleaned=`echo $v | sed -e 's/[^0-9][^0-9]*$//'`
local last_num=`echo $cleaned | sed -e 's/[0-9]*\.//g'`
local next_num=$(($last_num+1))
# Finally replace the last number in version string with the new one.
echo $v | sed -e "s/[0-9][0-9]*\([^0-9]*\)$/$next_num/"
}
Und ich benutze dies, indem ich einfach anrufe
new_version=$(advance_version $version)
Hoffe das hilft jemandem.
quelle
grep -e '^[[:digit:]]'
Antworten:
Das Maven Help Plugin schlägt irgendwie schon etwas dafür vor:
So würden Sie es in der Befehlszeile aufrufen, um Folgendes zu erhalten
${project.version}
:quelle
[INFO]
Nachrichten herausfiltern könnte ? Ich habe keinen Schalter für Maven gefunden. Andernfalls füge ich einfach einige Befehlszeilenskripte hinzu, um die Versionsnummer zu analysieren.mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
. Um es in einer Variablen in Bash zu erfassen, verwenden Sieversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Toms Lösung mit dem Exec Maven Plugin ist viel besser, aber immer noch komplizierter als es sein muss. Für mich ist es so einfach wie:
quelle
mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
-Dexec.args='${project.groupId}:${project.artifactId}:${project.version}'
.[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (default-cli) on project audit-events-processor-parent: Command execution failed. Cannot run program "maven" (in directory "/tmp"): error=2, No such file or directory
Achselzucken noch eine Antwort, die für mich nicht funktioniert,set -o errexit
Ich habe einige Nachforschungen angestellt und Folgendes festgestellt:
Maven wurde beschuldigt, weil die Integration in DevOps-Tools nicht einfach ist, da einige bewährte Methoden für CLI-Tools nicht befolgt werden. (Ref: https://youtu.be/1ILEw6Qca3U?t=372 )
Inspiriert von der vorherigen Behauptung, habe ich mich entschlossen, einen Blick auf den Quellcode von maven sowie auf das Maven-Help-Plugin zu werfen. Es scheint, dass sie den -q-Schalter des Maven ein wenig repariert haben (ich verwende Version 3.5.3). Wenn Sie ihn also bestehen, erhalten Sie nicht alle nervigen, unsinnigen Protokollierungsmaterialien, die die Verwendung des Maven verhindern innerhalb automatisierter Skripte. Sie sollten also in der Lage sein, Folgendes zu verwenden:
Das Problem ist, dass dieser Befehl nichts druckt, da das Hilfe-Plugin standardmäßig über den Logger ausgegeben wird, der durch den Schalter -q stummgeschaltet wurde. (Die neueste verfügbare Version des Plugins ist 3.1.0 und wurde am 3. Juni 2018 veröffentlicht.)
Karl Heinz Marbaise ( https://github.com/khmarbaise ) hat das Problem behoben, indem er einen optionalen Parameter hinzugefügt hat, mit dem Sie es folgendermaßen aufrufen können:
Die Commit-Beschreibung finden Sie unter: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )
quelle
-q
Schalter nicht benutze , wird die Version korrekt gedruckt (zwischen den Protokollzeilen). Irgendwelche Ideen?-q
Switch gut funktioniert .-q -DforceStdout
leer und es wurde sogar sichergestellt, dass Version 3.1.0 des Plugins mit pluginManagement verwendet wurde. Ich habe Maven Wrapper mit Version 3.5.4 von Maven konfiguriert und es hat korrekt funktioniertquelle
2> /dev/null
wie Sie sonst bekommen könnenPicked up _JAVA_OPTIONS:
| findstr /v "["
.Die beste Antwort ist meiner Meinung nach ziemlich Müll. Sie müssen ein paar grep verwenden, um die Ausgabe der Maven-Konsole zu hacken. Warum nicht das richtige Werkzeug für den Job verwenden? Die Verwendung der xpath-Syntax ist der beste Ansatz zum Abrufen der Versionsnummer, da dies die beabsichtigte Methode für den Zugriff auf eine XML-Datenstruktur ist. Der folgende Ausdruck durchläuft den POM unter Verwendung des "lokalen Namens" der Elemente, dh er ignoriert Namespace-Deklarationen, die in der XML vorhanden sein können oder nicht.
quelle
mvn
der richtige Ansatz ist und dasexec
Plugin tatsächlich gut funktioniert, aber alle MVN-Lösungen müssen aufgelöst werden, und ich versuche, eine Build-Pipeline zu booten, bei der die Auflösung von Abhängigkeiten nicht funktioniert. Daher werde ich denexec
Ansatz durch diese Lösung ersetzen . Zum Glück muss ich mir keine Sorgen um Versionen machen, die von den Eltern geerbt wurden.${revision}
zum Beispiel ist. Ref. maven.apache.org/maven-ci-friendly.htmlDadurch wird vermieden, dass Protokolleinträge aus der Ausgabe entfernt werden müssen:
quelle
Dies ist die sauberste Lösung, die ich gefunden habe:
Vorteile:
Hinweis:
maven-help-plugin
Version3.2.0
(und höher) hatforceStdout
Option. Sie können den3.2.0
obigen Befehl durch eine neuere Version aus der Liste der verfügbaren Versionen des mvn-help-Plugins von artifactory ersetzen , falls verfügbar.-q
unterdrückt ausführliche Meldungen ([INFO]
,[WARN]
etc.)Wenn Sie holen wollen
groupId
undartifactId
auch, überprüfen Sie diese Antwort .quelle
Solange Sie Python 2.5 oder höher haben, sollte dies funktionieren. Wenn Sie eine niedrigere Version haben, installieren Sie
python-lxml
den Import und ändern Sie ihn in lxml.etree. Diese Methode ist schnell und erfordert kein Herunterladen zusätzlicher Plugins. Es funktioniert auch mit fehlerhaften pom.xml-Dateien, die nicht mit xmllint validiert werden, wie die, die ich analysieren muss. Getestet auf Mac und Linux.quelle
Ich bin immer wieder auf Nebenfälle gestoßen, als ich einige der anderen Antworten hier verwendet habe, also hier noch eine andere Alternative.
quelle
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
Wenn es Ihnen nichts ausmacht, die Version in eine temporäre Datei zu schreiben, gibt es eine andere Lösung (ohne grep / sed), die für mich gut funktioniert. ( EDIT : siehe rjrjr Antwort für eine viel einfachere Lösung ohne temporäre Datei Aufwand)
Ich benutze das Exec Maven Plugin zusammen mit der
echo
Binärdatei. Im Gegensatz zum Maven Help Plugin ermöglicht das Exec Plugin die Umleitung der Ausgabe in eine Datei, mit der grep / sed umgangen werden kann, und ermöglicht es sogar, seltsame Dinge wie mehrzeilige Versionszeichenfolgen (mit CDATA-Block im Versions-Tag) zu analysieren. zumindest bis zu einem gewissen Grad.quelle
Nur zur Veranschaulichung: Es ist möglich, die einfache SLF4J-Protokollierung von Maven direkt in der Befehlszeile zu konfigurieren, um nur das auszugeben, was wir benötigen, indem Sie Folgendes konfigurieren:
org.slf4j.simpleLogger.defaultLogLevel=WARN
undorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO
wie unter http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html dokumentiert
Als Ergebnis kann man einfach laufen
tail -1
und erhalten:Beachten Sie, dass dies ein Einzeiler ist.
MAVEN_OPTS
werden nur für diese bestimmtemvn
Ausführung umgeschrieben .quelle
Ich bemerkte einige falsche
Downloaded:
Zeilen in der Ausgabe, die meine ursprüngliche Aufgabe brachen. Hier ist der Filter, auf den ich mich festgelegt habe. ich hoffe es hilft!BEARBEITEN
Nicht 100% sicher warum, aber wenn dies durch ein Post-Build-Skript in Jenkins ausgeführt wird, wird die Ausgabe wie
[INFO]version
z[INFO]0.3.2
.Ich habe die Ausgabe in eine Datei geschrieben und sie direkt von BASH aus durch meinen ersten Filter ausgeführt. Es funktioniert einwandfrei. Also wieder unsicher, was in Jenkins Land los ist.
Um es in Jenkins zu 100% zu erreichen, habe ich einen Nachfolgefilter hinzugefügt
sed
. Hier ist meine neuesteBEARBEITEN
Ein letzter Hinweis hier. Ich fand heraus, dass dies
tr
immer noch zu Dingen wie/r/n0.3.2
(wieder nur beim Laufen über Jenkins) führte. Umgeschaltet aufawk
und das Problem ist weg! Mein letztes Arbeitserquelle
Eine einfache Lösung nur für Maven
Und für Bonuspunkte wurde ein Teil einer Version analysiert
quelle
Ich habe kürzlich das Release Candidate Maven-Plugin entwickelt, das genau dieses Problem löst, sodass Sie nicht auf hackige Shell-Skripte zurückgreifen und die Ausgabe von analysieren müssen
maven-help-plugin
.Führen Sie beispielsweise Folgendes aus, um die Version Ihres Maven-Projekts auf einem Terminal zu drucken:
das gibt Ausgabe ähnlich wie
maven-help-plugin
:Sie können jedoch auch ein beliebiges Ausgabeformat angeben (damit die Version von einem CI-Server wie TeamCity aus dem Protokoll abgerufen werden kann ):
Was in ... endet:
So speichern Sie die Ausgabe in einer Datei (damit ein CI-Server wie Jenkins sie verwenden kann ):
Die resultierende
version.properties
Datei sieht folgendermaßen aus:Darüber hinaus können Sie mit Release Candidate die Version Ihres Projekts (was Sie wahrscheinlich auf Ihrem CI-Server tun würden) basierend auf der API-Version festlegen, die Sie in Ihrem POM definiert haben.
Wenn Sie ein Beispiel für die Verwendung von Release Candidate als Teil des Maven-Lebenszyklus sehen möchten, schauen Sie sich
pom.xml
mein anderes Open-Source-Projekt an - Build Monitor for Jenkins .quelle
Es gibt auch eine Option ohne Notwendigkeit Maven:
quelle
grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p
Um das dritte Vorkommen zu erhalten, verwenden Sie:grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p
und so weiterDie leicht verständliche All-in-One-Lösung, die die Maven-Projektversion ausgibt und überflüssige Ausgaben von
[INFO]
undDownload
Nachrichten unterdrückt :Das Gleiche, aber in zwei Zeilen aufgeteilt:
Ausgänge:
4.3-SNAPSHOT
Verwenden Sie Ihr
project.version
in einem einfachen Bash-Skript:Andere Lösungen auf dieser Seite schienen nicht alle Tricks in einem zu kombinieren.
quelle
Sollte einfacher sein, da dieser Fehler im Maven-Help-Plugin 3.0.0 behoben ist: MPH-99 Evaluate hat im leisen Modus keine Ausgabe .
quelle
Dies ist bei weitem die einfachste Lösung zum Ausschneiden und Einfügen von Bash:
es hallt wider
quelle
Ich habe das richtige Gleichgewicht für mich gefunden. Nach dem
mvn package
Maven-Archiver erstellt das Plugintarget/maven-archiver/pom.properties
mit Inhalten wie diesenund ich benutze bash nur um es auszuführen
dann
Natürlich ist die Ausführung dieser Datei überhaupt nicht sicher, aber die Ausführung kann leicht in ein Perl- oder Bash-Skript konvertiert werden, um Umgebungsvariablen aus dieser Datei zu lesen und festzulegen.
quelle
Dies funktionierte für mich offline und ohne abhängig von mvn:
quelle
Das Exec-Plugin funktioniert ohne Analyse der Ausgabe, da die Ausgabe in eine Datei umgeleitet und über das EnvInject-Plugin wieder in die Jobumgebung eingefügt werden kann:
quelle
Basierend auf der Frage verwende ich dieses Skript unten, um meine Versionsnummer in allen übergeordneten / Submodulen von Maven automatisch zu erhöhen:
quelle
Entweder haben
mvn
Sie die Antwort gegeben (wie die meisten Antworten vermuten lassen), oder Sie extrahieren die Antwort aus derpom.xml
. Der einzige Nachteil des zweiten Ansatzes besteht darin, dass Sie den Wert des<version/>
Tags sehr einfach extrahieren können. Dies ist jedoch nur dann sinnvoll, wenn es sich um ein Literal handelt, dh nicht um eine Maven-Eigenschaft. Ich habe diesen Ansatz trotzdem gewählt, weil:mvn
ist viel zu ausführlich und ich mag es einfach nicht, seine Ausgabe zu filtern.mvn
ist sehr langsam im Vergleich zum Lesen derpom.xml
.<version/>
.mvn-version
ist einzsh
Shell-Skript, mitxmlstarlet
dempom.xml
die Version des Projekts (falls vorhanden) oder die Version des übergeordneten Projekts (falls vorhanden) gelesen und gedruckt wird:Der Vorteil ist, dass es viel schneller ist als das Laufen
mvn
:Der Unterschied auf meiner Maschine ist größer als zwei Größenordnungen.
quelle
Ich brauche genau diese Anforderung während meines Travis-Jobs, aber mit mehreren Werten. Ich beginne mit dieser Lösung aber wenn ich mehrmals anrufe, ist dies sehr langsam (ich benötige 5 Ausdrücke).
Ich habe ein einfaches Maven-Plugin geschrieben, um die Werte von pom.xml in die .sh-Datei zu extrahieren.
https://github.com/famaridon/ci-tools-maven-plugin
Wird das produzieren:
Jetzt können Sie die Datei einfach als Quelle verwenden
Habe Spaß.
quelle
Ich benutze einen Einzeiler in meiner Unix-Shell ...
Sie können diese Zeile in einem Shell-Skript oder als Alias ausblenden.
quelle
Dies ist eine Bearbeitung von oben
Ich habe es auf der cmdline getestet und funktioniert gut
grep "" pom.xml | Kopf -n 1 | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g"
ist eine andere Version davon. Ich muss die Versionsnummer in Jenkins CI in k8s ohne mvn installieren, daher ist dies am hilfreichsten
Danke an alle.
quelle
Ich füge nur eine kleine
sed
Filterverbesserung hinzu, die ich kürzlich implementiert habe, umproject.version
aus der Maven-Ausgabe zu extrahieren .quelle
Dies ist, was ich verwendet habe, um die Versionsnummer zu erhalten, dachte, es hätte einen besseren Maven-Weg gegeben, dies zu tun
quelle