Jak pobrać wersję projektu Maven do wiersza poleceń bash

201

Poprzednio zadałem pytanie, jak zmienić wersję projektu Maven z wiersza poleceń, co doprowadziło mnie do nowego problemu.

Wcześniej byłem w stanie uzyskać numer wersji, ponieważ wersja była przechowywana jako właściwość, którą łatwo było grepować i analizować z linii poleceń (bash). Teraz, gdy użyto do tego elementu pom.xml, nie jest on już unikalny, ponieważ wszystkie zależności i być może niektórzy inni też tego używają. Myślę, że nie ma sposobu, aby uzyskać bieżący numer wersji za pomocą skryptu bash bez zewnętrznych narzędzi do parsowania xml lub jakiegoś bardzo kontekstowego polecenia sed.

Moim zdaniem najczystszym rozwiązaniem byłoby przekazanie przez Maven tej informacji o wersji. Myślałem o napisaniu niestandardowej wtyczki maven do wyszukiwania różnych właściwości, ale pomyślałem, że najpierw zapytam tutaj.

Czy jest więc jakiś prosty sposób na uzyskanie wartości w ${project.version}wierszu poleceń? Z góry dziękuję.

Rozwiązanie

Dziękuję za pomoc. Musiałem cdręcznie przejść do katalogu, ale można to łatwo zrobić. W moim skrypcie bash mam

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 } }'`

Co daje mi aktualną wersję, którą mogę później ulepszyć. Grepping może być prostszy, ale pomyślałem, że chciałbym być tak solidny, jak to możliwe, więc jestem zadowolony z pierwszej linii, która zaczyna się od cyfry i staram się traktować to jako numer wersji.

# 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/"
}

I używam tego po prostu dzwoniąc

new_version=$(advance_version $version)

Mam nadzieję, że to komuś pomoże.

mkko
źródło
1
Wydaje się, że w rozwiązaniu brakuje sedna.
nawroth
Który sed exp? Nie mogę tego zauważyć.
mkko
1
zrobić to mvn -o dla szybszej egzekucji
Nathan Bubna
2
Możesz zastąpić to złożone wyrażenie sed prostymgrep -e '^[[:digit:]]'
bpedman
2
Jeśli użyjesz opcji -o zgodnie z zaleceniami @NathanBubna, spowoduje to przełączenie maven w tryb „offline”. Jeśli nie masz jeszcze pobranej wtyczki pomocy maven i zależnych słoików, kompilacja zakończy się niepowodzeniem. Zostałam przez to trochę spalona, ​​mam nadzieję, że pomoże to komuś innemu.
phillipuniverse

Odpowiedzi:

217

Maven Pomoc Plugin jest w jakiś sposób już proponuje coś dla tego:

  • help:evaluate ocenia wyrażenia Maven podane przez użytkownika w trybie interaktywnym.

Oto jak wywołałbyś go w wierszu poleceń, aby uzyskać ${project.version}:

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
    -Dexpression=project.version
Pascal Thivent
źródło
8
Ok, dzięki. Myślę, że to jest najbliższe czystego rozwiązania. Jakieś pomysły, jak mogę zignorować wyniki maven i odfiltrować te [INFO]wiadomości? Nie znalazłem przełącznika na maven. W przeciwnym razie dodam skrypty z wiersza poleceń, aby przeanalizować numer wersji.
mkko
80
Usuwam wszystkie wiadomości logowania (INFO, OSTRZEŻENIE itp.) I „Pobierz” za pomocąmvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick
13
nie oczekiwałbym od maven niczego mniej gadatliwego
Andy
24
Oto podejście, które faworyzuję:printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
ash
40
@montoyaed opublikował najlepszą odpowiedź, która jest po prostu mvn help:evaluate -Dexpression=project.version -q -DforceStdout. Aby uchwycić ją w zmiennej w bashu użytkuversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Sebastian Thomschke
200

Rozwiązanie Toma z wtyczką Exec Maven jest znacznie lepsze, ale wciąż bardziej skomplikowane, niż musi być. Dla mnie jest to tak proste, jak:

MVN_VERSION=$(mvn -q \
    -Dexec.executable=echo \
    -Dexec.args='${project.version}' \
    --non-recursive \
    exec:exec)
rjrjr
źródło
30
Myślę, że jest to najłatwiejszy sposób, ponieważ nie oznacza użycia grep lub podobnych rzeczy. Szybka uwaga: możesz nieco skrócić:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
scrutari,
1
To rozwiązanie działa dobrze dla mnie, jak chciałem wydrukować GroupID, artifactId oraz wersję .. -Dexec.args='${project.groupId}:${project.artifactId}:${project.version}'.
James H.
1
[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 wzruszając ramionami jeszcze jedna odpowiedź, która nie działa dla mnie, no cóż
cbmanica
Dziękuję, to najlepsze rozwiązanie, jakie do tej pory widziałem, ponieważ nie wymaga stosowania delikatnych poleceń grep / sed lub podobnych
Mike76,
Co to jestset -o errexit
theonlygusti
79

Przeprowadziłem badania i znalazłem następujące informacje:

  1. Winę ponosi Maven, ponieważ integracja z narzędziami DevOps nie jest łatwa, ponieważ nie przestrzega dobrych praktyk dotyczących narzędzi CLI. (zob .: https://youtu.be/1ILEw6Qca3U?t=372 )

  2. Zainspirowany poprzednim stwierdzeniem postanowiłem przyjrzeć się kodowi źródłowemu maven, a także wtyczce maven-help-plugin. Wygląda na to, że naprawili trochę przełącznik -q maven (używam wersji 3.5.3), więc teraz, jeśli go przejdziesz, nie dostaniesz wszystkich irytujących, nie sensownych logowań, które uniemożliwiają użycie maven w ramach automatycznych skryptów. Powinieneś być w stanie użyć czegoś takiego:

    mvn help:evaluate -Dexpression=project.version -q

    Problem polega na tym, że to polecenie nic nie drukuje, ponieważ domyślnie wtyczka pomocy wyświetla dane wyjściowe przez program rejestrujący, który został wyciszony przez przełącznik -q. (najnowsza dostępna wersja wtyczki to 3.1.0 wydana 3 czerwca 2018 r.)

  3. Karl Heinz Marbaise ( https://github.com/khmarbaise ) naprawił go, dodając opcjonalny parametr, który pozwala na wywołanie go w następujący sposób:

    mvn help:evaluate -Dexpression=project.version -q -DforceStdout

    Opis zatwierdzenia jest dostępny na stronie: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )

Eduardo Montoya
źródło
2
To byłoby moje preferowane rozwiązanie i jest również wspomniane na oficjalnych stronach pomocy . Jednak to nie działa dla mnie. Jestem na MacOS z Maven v3.5.3. Kiedy nie używam -qprzełącznika, drukuje on poprawnie wersję (pomiędzy wierszami dziennika). Jakieś pomysły?
gucce
3
To powinna być zaakceptowana odpowiedź. Działa w systemach Windows i Linux (nie próbowałem Max OSX) i jest to proste. Dziękuję Ci.
trash80
1
@montoyaedu Przepraszamy za brak odpowiedzi. W międzyczasie zaktualizowałem wersję maven 3.5.4, która działa dobrze z -qprzełącznikiem.
gucce,
1
@gucce Mogę potwierdzić, że zastosowana wersja maven wpływa na to: w wersji 3.5.2 (wersja pakietu w debian 9) dane wyjściowe -q -DforceStdoutbyły puste, nawet upewniając się, że wersja 3.1.0 wtyczki była używana z pluginManagement); skonfigurowałem owijarkę maven z wersją 3.5.4 maven i działało to poprawnie
Gorkk
3
Wreszcie praktyczne rozwiązanie bez grep na 2019 r. - (powinna to być przyjęta odpowiedź). Działa również z wersjami przyjaznymi dla CI - testowane na 3.3.9, 3.5.3, 3.5.4, 3.6.0
Ed Randall
47
mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['
użytkownik1712021
źródło
2
zrób to mvn -o dla szybszej egzekucji
Nathan Bubna
1
Zobacz moją odpowiedź (szybkie przesunięcie) poniżej, która również filtruje linie „Pobrane:”.
szybka zmiana w dniu
10
Jeśli użyjesz opcji -o zgodnie z zaleceniami @NathanBubna, spowoduje to przełączenie maven w tryb „offline”. Jeśli nie masz jeszcze pobranej wtyczki pomocy maven i zależnych słoików, kompilacja zakończy się niepowodzeniem. Zostałam przez to trochę spalona, ​​mam nadzieję, że pomoże to komuś innemu.
phillipuniverse
Możesz także dodać, 2> /dev/nullponieważ w przeciwnym razie możesz dostaćPicked up _JAVA_OPTIONS:
Jakub Bocheński
2
W systemie Windows zamień koniec polecenia na | findstr /v "[".
Tunaki
39

Najlepsza odpowiedź to dość śmieci, moim zdaniem, musisz użyć kilku grepów, aby zhakować wyjście konsoli maven. Dlaczego nie skorzystać z odpowiedniego narzędzia do pracy? Najlepszą metodą uzyskania numeru wersji jest użycie składni xpath, ponieważ jest to zamierzona metoda dostępu do struktury danych XML. Wyrażenie poniżej przemierza pom za pomocą „lokalnej nazwy” elementów, innymi słowy ignorując deklaracje przestrzeni nazw, które mogą, ale nie muszą być obecne w xml.

xmllint --xpath "//*[local-name()='project']/*[local-name()='version']/text()" pom.xml
lukeforehand
źródło
@ bobmarksie Popieram to; używanie maven i szorowanie wyników za pomocą wyrażeń regularnych jest bolesne.
mhvelplund
3
Co z projektem, który dziedziczy po pom-rodzicu.
Wes
2
„Dlaczego nie użyć odpowiedniego narzędzia do pracy?” IE! Maven?
jeremyjjbrown
Rozumiem, że używanie mvnjest właściwym podejściem, a execwtyczka faktycznie działa dobrze, ale wszystkie rozwiązania mvn muszą zostać rozwiązane, a ja próbuję uruchomić bootstrap kompilacji, w której rozwiązywanie zależności nie będzie działać, więc zamierzam zastąpić to execpodejście tym rozwiązaniem. Na szczęście nie muszę się martwić wersjami odziedziczonymi po rodzicach.
haridsv
To nie będzie działać z wersją przyjazną dla ci, gdzie wersja jest ${revision}na przykład właściwością . Nr ref. maven.apache.org/maven-ci-friendly.html
Ed Randall
30

Pozwoli to uniknąć konieczności odczytywania wpisów dziennika z danych wyjściowych:

mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q
Jose Alban
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak odpowiada na pytanie, znacznie poprawiłoby jego długoterminową wartość. Proszę edytować swoje odpowiedzi, aby dodać trochę wyjaśnień.
Toby Speight
1
Myślę, że dla tego podejścia konieczne jest umieszczenie „-q” po mvn.
Rudge
Jest to lepsze niż przyjęte rozwiązanie; nie ma potrzeby odfiltrowywania hałaśliwego wyjścia.
Willian Mitsuda,
19

To najczystsze rozwiązanie, jakie znalazłem:

mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout

Zalety:

  • Działa to dobrze we wszystkich systemach operacyjnych i wszystkich powłokach.
  • Nie potrzebujesz żadnych zewnętrznych narzędzi!

Uwaga:

  • maven-help-pluginwersja 3.2.0(i wyżej) ma forceStdoutopcję. Możesz zastąpić 3.2.0powyższą komendę nowszą wersją z listy dostępnych wersji mvn-help-plugin od artifactory, jeśli jest dostępna.
  • Opcja -qtłumi zbyt obszerne wiadomości ( [INFO], [WARN]etc.)

Jeśli chcesz, aby pobrać groupIdi artifactIdjak dobrze, sprawdź tę odpowiedź .

Manu Manjunath
źródło
13
python -c "import xml.etree.ElementTree as ET; \
  print(ET.parse(open('pom.xml')).getroot().find( \
  '{http://maven.apache.org/POM/4.0.0}version').text)"

Tak długo, jak masz Python 2.5 lub nowszy, to powinno działać. Jeśli masz niższą wersję, zainstaluj python-lxmli zmień import na lxml.etree. Ta metoda jest szybka i nie wymaga pobierania żadnych dodatkowych wtyczek. Działa również na zniekształconych plikach pom.xml, które nie sprawdzają poprawności za pomocą xmllint, takich jak te, które muszę przeanalizować. Testowane na komputerach Mac i Linux.

pdr
źródło
12

Ciągle spotykałem się z przypadkami pobocznymi, używając niektórych innych odpowiedzi tutaj, więc oto jeszcze jedna alternatywa.

version=$(printf 'VER\t${project.version}' | mvn help:evaluate | grep '^VER' | cut -f2)
powolny
źródło
1
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
yegeniy
7

Jeśli nie masz nic przeciwko zapisaniu wersji do pliku tymczasowego, istnieje inne rozwiązanie (bez grep / sed), które działa dobrze dla mnie. ( EDYCJA : patrz odpowiedź rjrjr na znacznie prostsze rozwiązanie bez żadnych tymczasowych problemów z plikami)

Używam wtyczki Exec Maven wraz z echoplikiem binarnym. W przeciwieństwie do wtyczki Maven Help, wtyczka Exec umożliwia przekierowanie wyjścia do pliku, którego można użyć do obejścia grep / sed, a nawet umożliwia analizowanie dziwnych rzeczy, takich jak ciągi wersji wielowierszowej (z blokiem CDATA w znaczniku wersji), przynajmniej do pewnego stopnia.

#!/usr/bin/env sh

MVN_VERSION=""
VERSION_FILE=$( mktemp mvn_project_version_XXXXX )
trap "rm -f -- \"$VERSION_FILE\"" INT EXIT

mvn -Dexec.executable="echo" \
    -Dexec.args='${project.version}' \
    -Dexec.outputFile="$VERSION_FILE" \
    --non-recursive \
    --batch-mode \
    org.codehaus.mojo:exec-maven-plugin:1.3.1:exec > /dev/null 2>&1 ||
    { echo "Maven invocation failed!" 1>&2; exit 1; }

# if you just care about the first line of the version, which will be
# sufficent for pretty much every use case I can imagine, you can use
# the read builtin
[ -s "$VERSION_FILE" ] && read -r MVN_VERSION < "$VERSION_FILE"

# Otherwise, you could use cat.
# Note that this still has issues when there are leading whitespaces
# in the multiline version string
#MVN_VERSION=$( cat "$VERSION_FILE" )

printf "Maven project version: %s\n" "$MVN_VERSION"
Tomek
źródło
6
Jest to znacznie lepsze rozwiązanie niż wtyczka pomocnicza i nie potrzebujesz całego tego we / wy. Wystarczy dodać flagę -q, a jedynym wyjściem będzie wersja. Więc: mvn -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' --non-recursive org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec
rjrjr
rjrjr: Świetnie! Jedyne, o czym muszę tu wspomnieć, to obsługa błędów: jeśli mvn zawiedzie, otrzymasz nieprawidłowy ciąg wersji. Dlatego wymagana jest pewna walidacja, np. Sprawdzenie kodu powrotu mvn lub samego łańcucha.
Tom
6

Dla przypomnienia możliwe jest skonfigurowanie prostego logowania SLF4J Maven bezpośrednio w wierszu poleceń, aby wyświetlać tylko to, czego potrzebujemy, konfigurując:

  • org.slf4j.simpleLogger.defaultLogLevel=WARN i
  • org.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO

zgodnie z dokumentacją na stronie http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html

MAVEN_OPTS="\
-Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO" \
mvn help:evaluate -o -Dexpression=project.version

W rezultacie można uruchomić po prostu tail -1i uzyskać:

$ MAVEN_OPTS="\
-Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO" \
mvn help:evaluate -o -Dexpression=project.version | tail -1

1.0.0-SNAPSHOT

Pamiętaj, że jest to jedna linijka. MAVEN_OPTSsą przepisywane tylko dla tego konkretnego mvnwykonania.

Stepan Vavra
źródło
5

Zauważyłem, Downloaded:że na wyjściu pojawiły się fałszywe linie, które łamały moje pierwotne zadanie. Oto filtr, na którym się zdecydowałem; mam nadzieję, że to pomoże!

version=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | egrep -v '^\[|Downloading:' | tr -d ' \n')

EDYTOWAĆ

Nie jestem w 100% pewien, dlaczego, ale kiedy uruchomiłem to za pomocą skryptu po kompilacji w Jenkins, wyjście wychodziło jak [INFO]versionnp[INFO]0.3.2 .

Zrzuciłem dane wyjściowe do pliku i przepuściłem je przez mój pierwszy filtr bezpośrednio z BASH, działa dobrze .., więc znów nie jestem pewien, co się dzieje w krainie Jenkins.

Aby uzyskać go w 100% w Jenkins, dodałem sedfiltr uzupełniający ; oto moje najnowsze

version=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | egrep -v '^\[|Downloading:' | tr -d ' \n' | sed -E 's/\[.*\]//g')

EDYTOWAĆ

I ostatnia uwaga tutaj .. I okazało się, trbył nadal skutkuje rzeczy jak /r/n0.3.2(ponownie tylko wtedy, gdy uruchomiony poprzez Jenkins). Przełączono na awki problem zniknął! Mój końcowy wynik pracy

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version \
| egrep -v '^\[|Downloading:' | sed 's/[^0-9\.]//g' | awk 1 ORS=''
szybka zmiana
źródło
5

Proste rozwiązanie tylko dla maven

mvn -q -N org.codehaus.mojo:exec-maven-plugin:1.3.1:exec \
    -Dexec.executable='echo' \
    -Dexec.args='${project.version}'

A dla punktów bonusowych przeanalizowano część wersji

mvn -q -N org.codehaus.mojo:build-helper-maven-plugin:3.0.0:parse-version \
    org.codehaus.mojo:exec-maven-plugin:1.3.1:exec \
    -Dexec.executable='echo' \
    -Dexec.args='${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}'
Jakob O.
źródło
5

Niedawno opracowałem wtyczkę Release Candidate Maven, która rozwiązuje dokładnie ten problem, dzięki czemu nie musisz uciekać się do żadnych zhackowanych skryptów powłoki i analizowania danych wyjściowych maven-help-plugin.

Na przykład, aby wydrukować wersję projektu Maven na terminalu, uruchom:

mvn com.smartcodeltd:release-candidate-maven-plugin:LATEST:version

co daje wynik podobny do maven-help-plugin:

[INFO] Detected version: '1.0.0-SNAPSHOT'
1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Można jednak również określić dowolny format wyjściowy (aby wersja mogła zostać pobrana z dziennika przez serwer CI, taki jak TeamCity ):

mvn com.smartcodeltd:release-candidate-maven-plugin:LATEST:version \
   -DoutputTemplate="##teamcity[setParameter name='env.PROJECT_VERSION' value='{{ version }}']"

Co skutkuje w:

[INFO] Detected version: '1.0.0-SNAPSHOT'
##teamcity[setParameter name='env.PROJECT_VERSION' value='1.0.0-SNAPSHOT']
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Aby zapisać dane wyjściowe w pliku (aby serwer CI taki jak Jenkins mógł z niego skorzystać ):

mvn com.smartcodeltd:release-candidate-maven-plugin:LATEST:version \
   -DoutputTemplate="PROJECT_VERSION={{ version }}" \
   -DoutputUri="file://\${project.basedir}/version.properties"

Wynikowy version.propertiesplik będzie wyglądał następująco:

PROJECT_VERSION=1.0.0-SNAPSHOT

Oprócz wszystkich powyższych, Release Candidate pozwala również ustawić wersję projektu (co prawdopodobnie zrobiłbyś na serwerze CI) na podstawie wersji API zdefiniowanej w POM.

Jeśli chcesz zobaczyć przykład użycia kandydata do wydania jako części cyklu życia Maven, spójrz na pom.xmlmój inny projekt open source - Build Monitor dla Jenkinsa .

Jan Molak
źródło
5

Jest też jedna opcja bez potrzeby Maven:

grep -oPm1 "(?<=<version>)[^<]+" "pom.xml"
Michał Šípek
źródło
Ten pokazuje tylko pierwsze wystąpienie w pom. W moim przypadku pierwsze wystąpienie daje wersja nadrzędna pom. Ale szczerze mówiąc, to była odpowiedź, której szukałem. Jest znacznie szybszy niż wspomniane wcześniej rozwiązania i łatwo go zmodyfikować, aby uzyskać prawidłowe działanie. Aby uzyskać drugie wystąpienie użyj: grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pAby uzyskać trzecie wystąpienie użyj: grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pi tak dalej
Krzysztof Cieśliński
Zakładasz, że element wersji jest pierwszym wystąpieniem i nie działa, gdy założenie jest nieprawidłowe.
devildelta
3

Łatwe do zrozumienia, kompleksowe rozwiązanie, które wyświetla wersję projektu maven i eliminuje zbędne dane wyjściowe [INFO]i Downloadkomunikaty:

mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['

To samo, ale podzielone na dwie linie:

mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
      -Dexpression=project.version | grep -v '\['

Wyjścia: 4.3-SNAPSHOT

Używając twojego project.versionw prostym skrypcie bash:

projectVersion=`mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['`
cd "target/"$projectVersion"-build"

Inne rozwiązania na tej stronie nie łączyły wszystkich sztuczek w jedną.

Peter Dietz
źródło
3

Jest to zdecydowanie najłatwiejsze rozwiązanie do wycinania i wklejania bash:

VERSION=$(mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q)
echo $VERSION

odbija się echem

1.4
freedev
źródło
2

Znalazłem dla siebie odpowiednią równowagę. Po tym, jak mvn packagemaven-archiver tworzy wtyczkę target/maven-archiver/pom.propertiesz zawartością taką jak ta

version=0.0.1-SNAPSHOT
groupId=somegroup
artifactId=someArtifact

i używam bash tylko po to, aby go wykonać

. ./target/maven-archiver/pom.properties

następnie

echo $version
0.0.1-SNAPSHOT

Oczywiście wykonanie tego pliku wcale nie jest bezpieczne, ale wykonanie można łatwo przekonwertować na skrypt perl lub bash, aby odczytać i ustawić zmienną środowiskową z tego pliku.

Vladimir I.
źródło
1

Działa to dla mnie offline i bez zależności od mvn:

VERSION=$(grep --max-count=1 '<version>' <your_path>/pom.xml | awk -F '>' '{ print $2 }' | awk -F '<' '{ print $1 }')
echo $VERSION
Jerzy
źródło
1

Wtyczka Exec działa bez analizowania danych wyjściowych, ponieważ dane wyjściowe można przekierować do pliku i wstrzyknąć z powrotem do środowiska zadania za pomocą wtyczki EnvInject:

wprowadź opis zdjęcia tutaj

Ondřej Kmoch
źródło
1

Bazując na pytaniu, używam tego skryptu poniżej, aby automatycznie zwiększyć numer wersji we wszystkich rodzicach / submodułach maven:

#!/usr/bin/env bash  

# 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/"  
}  

version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout)  

new\_version=$(advance\_version $version)  

mvn versions:set -DnewVersion=${new\_version} -DprocessAllModules -DgenerateBackupPoms=false
Yu Jiaao
źródło
0

Albo mvndałeś ci odpowiedź (jak sugeruje większość odpowiedzi), albo wyciągasz odpowiedź z pom.xml. Jedyną wadą drugiego podejścia jest to, że można bardzo łatwo wyodrębnić wartość <version/>znacznika, ale będzie on sensowny tylko wtedy, gdy będzie dosłowny , to znaczy nie będzie własnością Maven. Mimo to wybrałem to podejście, ponieważ:

  • mvn jest sposobem na gadatliwe i po prostu nie lubię filtrować jego wyników.
  • Rozpoczęcie mvnjest bardzo wolne w porównaniu do czytania pom.xml.
  • Zawsze używam literalnych wartości w <version/>.

mvn-versionto zshskrypt powłoki, który używa xmlstarletdo odczytu pom.xmli wydruku wersji projektu (jeśli istnieje) lub wersji projektu nadrzędnego (jeśli istnieje):

$ mvn-version .
1.0.0-SNAPSHOT

Zaletą jest to, że jest znacznie szybszy niż bieganie mvn:

$ time mvn-version .
1.1.0-SNAPSHOT
mvn-version .  0.01s user 0.01s system 75% cpu 0.019 total

$ time mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
> -Dexpression=project.version
mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate   4.17s user 0.21s system 240% cpu 1.823 total

Różnica na mojej maszynie jest większa niż dwa rzędy wielkości.

Enrico M. Crisostomo
źródło
0

Potrzebuję dokładnie tego wymagania podczas mojej pracy Travis, ale z wieloma wartościami. Zaczynam od tego rozwiązania, ale dzwonienie wielokrotne jest bardzo wolne (potrzebuję 5 wyrażeń).

Napisałem prostą wtyczkę maven, aby wyodrębnić wartości pom.xml do pliku .sh.

https://github.com/famaridon/ci-tools-maven-plugin

mvn com.famaridon:ci-tools-maven-plugin:0.0.1-SNAPSHOT:environment -Dexpressions=project.artifactId,project.version,project.groupId,project.build.sourceEncoding

Wyprodukuje to:

#!/usr/bin/env bash
CI_TOOLS_PROJECT_ARTIFACTID='ci-tools-maven-plugin';
CI_TOOLS_PROJECT_VERSION='0.0.1-SNAPSHOT';
CI_TOOLS_PROJECT_GROUPID='com.famaridon';
CI_TOOLS_PROJECT_BUILD_SOURCEENCODING='UTF-8';

teraz możesz po prostu źródło pliku

source .target/ci-tools-env.sh

Baw się dobrze.

Florent Amaridon
źródło
-1

Używam jednowierszowego w mojej powłoce unix ...

cat pom.xml | grep "" | głowa -n 1 | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g”

Możesz ukryć tę linię w skrypcie powłoki lub jako alias.

MichaOnline
źródło
-1

to jest edycja z góry

cat pom.xml | grep "" | głowa -n 1 | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g”

Przetestowałem to na cmdline działa dobrze

grep "" pom.xml | głowa -n 1 | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g”

jest inną wersją tego samego. Muszę uzyskać numer wersji w Jenkins CI w k8s bez zainstalowanego mvn, więc jest to najbardziej pomocne

Dziękuje wszystkim.

Philip Ruff
źródło
-2
mvn help:evaluate -Dexpression=project.version | sed -e 1h -e '2,3{H;g}' -e '/\[INFO\] BUILD SUCCESS/ q' -e '1,2d' -e '{N;D}' | sed -e '1q'

Właśnie dodałem małe sedulepszenie filtra, które niedawno wdrożyłem, aby wyodrębnić project.versionz wyjścia maven.

websigni
źródło
-2
VERSION=$(head -50 pom.xml | awk -F'>' '/SNAPSHOT/ {print $2}' | awk -F'<' '{print $1}')

Właśnie tak otrzymywałem numer wersji, pomyślałem, że byłby lepszy sposób na zrobienie tego

Tristik
źródło