Cara mendapatkan versi proyek Maven ke baris perintah bash


201

Sebelumnya saya mengeluarkan pertanyaan tentang bagaimana mengubah vesion proyek Maven dari baris perintah yang membawa saya ke masalah baru.

Sebelumnya saya bisa mendapatkan nomor versi karena versi disimpan sebagai properti yang mudah untuk di-grep dan diurai dari baris perintah (bash). Sekarang elemen pom.xml digunakan untuk ini, tidak lagi unik karena semua dependensi dan mungkin beberapa orang lain juga menggunakan ini. Saya pikir tidak ada cara untuk mendapatkan nomor versi saat ini dengan skrip bash tanpa alat eksternal untuk parsing xml atau perintah sed yang sangat memperhatikan konteks.

Solusi paling bersih menurut saya adalah bagi Maven untuk membagikan informasi versi ini. Saya sedang berpikir untuk menulis plugin pakar untuk mengambil properti yang berbeda tapi saya pikir saya akan bertanya di sini dulu.

Jadi, apakah ada cara mudah untuk mendapatkan nilai dari ${project.version}ke baris perintah? Terima kasih sebelumnya.

Larutan

Terima kasih atas bantuannya. Saya harus ke cddirektori secara manual tetapi itu bisa dilakukan dengan mudah. Dalam skrip bash saya, saya punya

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

Yang memberi saya versi saat ini yang kemudian bisa saya lanjutkan. Grepping mungkin lebih sederhana tetapi saya pikir saya ingin sekuat mungkin, jadi saya puas dengan baris pertama yang dimulai dengan angka dan mencoba untuk menangani ini sebagai nomor versi.

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

Dan saya menggunakan ini hanya dengan menelepon

new_version=$(advance_version $version)

Semoga ini bisa membantu seseorang.


1
Solusinya sepertinya ketinggalan a 'untuk menyelesaikan ekspresi sed.
nawroth

Yang exp exp? Saya tidak bisa memperhatikan.
mkko

1
buat itu mvn -o untuk eksekusi lebih cepat
Nathan Bubna

2
Anda dapat mengganti bahwa ekspresi sed kompleks dengan sederhanagrep -e '^[[:digit:]]'
bpedman

2
Jika Anda menggunakan -o seperti yang direkomendasikan oleh @NathanBubna maka itu akan membuat pakar dalam mode 'offline'. Jika Anda belum memiliki plugin bantuan pakar dan stoples dependen yang diunduh maka build akan gagal. Terbakar oleh itu sebentar, berharap itu membantu orang lain.
phillipuniverse

Jawaban:


217

The Maven Bantuan Plugin entah bagaimana sudah mengusulkan sesuatu untuk ini:

  • help:evaluate mengevaluasi ekspresi Maven yang diberikan oleh pengguna dalam mode interaktif.

Ini adalah bagaimana Anda akan memintanya di baris perintah untuk mendapatkan ${project.version}:

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
    -Dexpression=project.version

8
Oke terima kasih. Saya pikir ini adalah yang terdekat saya akan mendapatkan solusi bersih. Ada ide bagaimana saya bisa menekan output pakar dan menyaring [INFO]pesan - pesan itu? Saya tidak menemukan saklar untuk pakar. Kalau tidak, saya hanya akan menambahkan beberapa scripting baris perintah untuk mem-parsing nomor versi.
mkko

80
Saya menghapus semua logging (INFO, PERINGATAN, dll) dan pesan 'Unduh' denganmvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick

13
tidak akan mengharapkan sesuatu yang kurang verbose dari pakar
Andy

24
Inilah pendekatan yang saya sukai:printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
ash

40
@montoyaed memposting jawaban terbaik yang sederhana mvn help:evaluate -Dexpression=project.version -q -DforceStdout. Untuk menangkapnya dalam sebuah variabel di Bash gunakanversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Sebastian Thomschke

200

Solusi Tom dengan Exec Maven Plugin jauh lebih baik, tetapi masih lebih rumit dari yang seharusnya. Bagi saya itu sesederhana:

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

30
Saya pikir ini adalah cara termudah karena tidak menyiratkan penggunaan grep atau hal serupa. Catatan cepat: Anda mungkin membuatnya sedikit lebih pendek:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
scrutari

1
Solusi ini bekerja dengan baik bagi saya karena saya ingin mencetak groupId, artifactId dan versi .. -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 angkat bahu jawaban lain yang tidak berhasil untuk saya, oh well
cbmanica

Terima kasih ini adalah solusi terbaik yang saya lihat sejauh ini, karena tidak perlu menerapkan perintah grep / sed yang rapuh atau serupa
Mike76

Apa ituset -o errexit
theonlygusti

80

Saya telah melakukan beberapa penelitian dan menemukan yang berikut:

  1. Maven telah disalahkan karena integrasi dengan alat-alat DevOps tidak mudah karena fakta bahwa ia tidak mengikuti beberapa praktik yang baik mengenai alat-alat CLI. (ref: https://youtu.be/1ILEw6Qca3U?t=372 )

  2. Terinspirasi oleh pernyataan sebelumnya, saya memutuskan untuk melihat kode sumber maven serta tentang maven-help-plugin. Tampaknya mereka telah memperbaiki sedikit switch maven's -q (saya menggunakan versi 3.5.3), jadi sekarang jika Anda melewatinya, Anda tidak akan mendapatkan semua hal-hal logging yang tidak masuk akal yang mengganggu yang mencegah penggunaan maven dari penggunaan dalam skrip otomatis. Jadi Anda harus dapat menggunakan sesuatu seperti ini:

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

    Masalahnya adalah bahwa perintah ini tidak mencetak apa-apa karena secara default plugin bantuan keluaran melalui logger yang telah dibungkam oleh saklar -q. (versi terbaru dari plugin yang tersedia adalah 3.1.0 dirilis pada 3 Juni 2018)

  3. Karl Heinz Marbaise ( https://github.com/khmarbaise ) memperbaikinya dengan menambahkan parameter opsional yang memungkinkan Anda memanggilnya dengan cara berikut:

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

    Deskripsi komit tersedia di: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )


2
Ini akan menjadi solusi pilihan saya dan juga disebutkan di halaman bantuan resmi . Namun, itu tidak berhasil untuk saya. Saya menggunakan MacOS dengan Maven v3.5.3. Ketika saya tidak menggunakan -qsaklar itu mencetak versi dengan benar (di antara baris log). Ada ide?
gucce

3
Ini harus menjadi jawaban yang diterima. Ini bekerja di Windows dan Linux (saya tidak mencoba Max OSX), dan itu sederhana. Terima kasih.
trash80

1
@montoyaedu Maaf karena tidak merespons. Sementara itu saya telah memperbarui ke pakar 3.5.4 yang berfungsi dengan baik dengan -qsaklar.
gucce

1
@ gucce Saya dapat mengkonfirmasi bahwa versi maven yang digunakan memengaruhi ini: dengan 3.5.2 (versi paket pada debian 9) output dengan -q -DforceStdoutkosong, bahkan memastikan versi 3.1.0 dari plugin digunakan dengan pluginManagement); saya mengkonfigurasi wrapper maven dengan versi 3.5.4 dari maven, dan bekerja dengan benar
Gorkk

3
Akhirnya, solusi praktis tanpa grep untuk 2019 - (ini harus menjadi jawaban yang diterima). Bekerja dengan versi CI-friendly juga - diuji pada 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 '\['

2
buat mvn -o untuk eksekusi yang lebih cepat
Nathan Bubna

1
Lihat jawaban saya (quickshiftin) di bawah ini yang menyaring baris 'Diunduh:' juga.
quickshiftin

10
Jika Anda menggunakan -o seperti yang direkomendasikan oleh @NathanBubna maka itu akan membuat pakar dalam mode 'offline'. Jika Anda belum memiliki plugin bantuan pakar dan stoples dependen yang diunduh maka build akan gagal. Terbakar oleh itu sebentar, berharap itu membantu orang lain.
phillipuniverse

Anda mungkin ingin juga menambahkan 2> /dev/nullkarena jika tidak, Anda bisa mendapatkanPicked up _JAVA_OPTIONS:
Jakub Bochenski

2
Di Windows, ganti akhir perintah dengan | findstr /v "[".
Tunaki

39

Jawaban teratas adalah sampah yang cukup menurut saya, Anda harus menggunakan banyak grep untuk meretas keluaran konsol pakar. Mengapa tidak menggunakan alat yang tepat untuk pekerjaan itu? Menggunakan sintaks xpath adalah pendekatan terbaik untuk mengambil nomor versi, karena itu adalah metode yang dimaksudkan untuk mengakses struktur data XML. Ekspresi di bawah ini melintasi pom menggunakan "nama lokal" elemen, dengan kata lain mengabaikan deklarasi namespace yang mungkin ada atau tidak ada dalam xml.

xmllint --xpath "//*[local-name()='project']/*[local-name()='version']/text()" pom.xml

@ Bobmarksie Aku yang kedua; menggunakan pakar dan menggosok output dengan regexp itu menyakitkan.
mhvelplund

3
Bagaimana dengan proyek yang diwarisi dari pom induk.
Wes

2
"Mengapa tidak menggunakan alat yang tepat untuk pekerjaan itu?" Yaitu! Maven?
jeremyjjbrown

Saya mengerti bahwa menggunakan mvnadalah pendekatan yang tepat dan execplugin benar-benar berfungsi dengan baik, tetapi semua solusi mvn harus menyelesaikan dan saya mencoba untuk mem-bootstrap pipeline build di mana resolusi dependensi tidak akan berfungsi, jadi saya akan mengganti execpendekatan dengan solusi ini. Untungnya, saya tidak perlu khawatir tentang versi yang diwarisi dari orang tua.
haridsv

Ini tidak akan berfungsi dengan versi yang ramah lingkungan, di mana versi tersebut adalah properti seperti ${revision}misalnya. Ref. maven.apache.org/maven-ci-friendly.html
Ed Randall

30

Ini akan menghindari keharusan untuk mengambil entri log dari output:

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

Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana ia menjawab pertanyaan akan secara signifikan meningkatkan nilai jangka panjangnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan.
Toby Speight

1
Saya pikir untuk pendekatan ini perlu untuk menempatkan "-q" setelah mvn.
Rudge

Ini lebih baik daripada solusi yang diterima; tidak perlu menyaring keluaran berisik maven.
Willian Mitsuda

20

Ini adalah solusi terbersih yang saya temukan:

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

Keuntungan:

  • Ini berfungsi dengan baik pada semua sistem operasi dan semua shell.
  • Tidak perlu alat eksternal!
  • [Penting] Ini berfungsi bahkan jika versi proyek diwarisi dari induk pom.xml

catatan:

  • maven-help-pluginversi 3.2.0(dan di atas) memiliki forceStdoutopsi. Anda dapat mengganti 3.2.0perintah di atas dengan versi yang lebih baru dari daftar versi mvn-help-plugin yang tersedia dari artifactory, jika tersedia.
  • Opsi -qmenekan pesan verbal ( [INFO], [WARN]dll.)

Jika Anda ingin mengambil groupIddan artifactIdjuga, periksa jawaban ini .


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

Selama Anda memiliki python 2.5 atau lebih besar, ini akan berfungsi. Jika Anda memiliki versi yang lebih rendah dari itu, instal python-lxmldan ubah impor ke lxml.etree. Metode ini cepat dan tidak perlu mengunduh plugin tambahan. Ini juga berfungsi pada file pom.xml cacat yang tidak divalidasi dengan xmllint, seperti yang saya perlu parsing. Diuji pada Mac dan Linux.


12

Saya terus mengalami kasus sampingan ketika menggunakan beberapa jawaban lain di sini, jadi inilah alternatif lain.

version=$(printf 'VER\t${project.version}' | mvn help:evaluate | grep '^VER' | cut -f2)

1
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
yegeniy

7

Jika Anda tidak keberatan untuk menulis versi ke file sementara, ada solusi lain (tanpa grep / sed) yang berfungsi baik untuk saya. ( EDIT : lihat jawaban rjrjr untuk solusi yang lebih sederhana tanpa kerumitan file sementara)

Saya menggunakan Exec Maven Plugin bersama dengan echobiner. Berbeda dengan Maven Help Plugin, Exec Plugin memungkinkan pengalihan output ke file, yang dapat digunakan untuk mem-bypass grep / sed, dan bahkan memungkinkan untuk mem-parsing hal-hal aneh seperti string versi multiline (dengan blok CDATA di tag versi), setidaknya sampai batas tertentu.

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

6
Ini adalah solusi yang jauh lebih baik daripada plugin helper, dan Anda tidak memerlukan semua itu i / o. Cukup tambahkan tanda -q dan satu-satunya keluaran adalah versi. Jadi: mvn -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' - non-rekursif org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec
rjrjr

rjrjr: Hebat! Satu-satunya hal yang perlu saya sebutkan di sini adalah penanganan kesalahan: Jika mvn gagal, Anda mendapatkan string versi yang tidak valid. Jadi beberapa validasi diperlukan, seperti memeriksa kode kembali mvn atau string itu sendiri.
Tom

6

Sebagai catatan saja, dimungkinkan untuk mengonfigurasi pencatatan SLF4J Simple Maven langsung di baris perintah untuk menghasilkan hanya apa yang kita butuhkan dengan mengkonfigurasi:

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

seperti yang didokumentasikan di 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

Sebagai hasilnya, seseorang dapat berjalan dengan sederhana tail -1dan mendapatkan:

$ 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

Perhatikan bahwa ini adalah satu garis. MAVEN_OPTSsedang ditulis ulang hanya untuk mvneksekusi khusus ini .


5

Saya perhatikan beberapa Downloaded:baris palsu muncul di output yang melanggar tugas asli saya. Inilah filter yang telah saya pilih; semoga membantu!

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

EDIT

Tidak 100% yakin mengapa, tetapi ketika menjalankan ini melalui skrip post-build di Jenkins, hasilnya keluar seperti [INFO]version, misalnya[INFO]0.3.2 .

Saya membuang output ke file dan menjalankannya melalui filter pertama saya langsung dari BASH, berfungsi dengan baik .., jadi sekali lagi, tidak yakin apa yang terjadi di tanah Jenkins.

Untuk mendapatkannya 100% di Jenkins, saya telah menambahkan sedfilter tindak lanjut ; ini yang terbaru

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

EDIT

Satu catatan terakhir di sini .. saya menemukan tritu masih menghasilkan hal-hal seperti /r/n0.3.2(lagi hanya ketika menjalankan melalui Jenkins). Beralih ke awkdan masalahnya telah hilang! Hasil kerja terakhir saya

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

5

Satu-satunya solusi pakar sederhana

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

Dan untuk poin bonus diuraikan bagian dari versi

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

5

Saya baru-baru ini mengembangkan Kandidat Rilis plugin Maven yang memecahkan masalah yang tepat ini sehingga Anda tidak perlu menggunakan skrip shell yang macet dan menguraikan output dari maven-help-plugin.

Misalnya, untuk mencetak versi proyek Maven Anda ke terminal, jalankan:

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

yang menghasilkan output yang mirip dengan maven-help-plugin:

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

Namun, Anda juga dapat menentukan format output sewenang - wenang (sehingga versi dapat diambil dari log oleh server CI seperti TeamCity ):

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

Yang mengakibatkan:

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

Untuk menyimpan output ke file (sehingga server CI seperti Jenkins dapat menggunakannya ):

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

File yang dihasilkan version.propertiesakan terlihat sebagai berikut:

PROJECT_VERSION=1.0.0-SNAPSHOT

Di atas semua hal di atas, Release Candidate juga memungkinkan Anda untuk mengatur versinya proyek Anda (yang mungkin akan Anda lakukan pada server CI Anda) berdasarkan versi API yang telah Anda tetapkan dalam POM Anda.

Jika Anda ingin melihat contoh Kandidat Rilis yang digunakan sebagai bagian dari siklus hidup Maven, lihat pom.xmlproyek sumber terbuka saya yang lain - Build Monitor for Jenkins .


5

Ada juga satu opsi tanpa perlu Maven:

grep -oPm1 "(?<=<version>)[^<]+" "pom.xml"

Ini hanya menunjukkan kejadian pertama di pom. Dalam kasus saya, kejadian pertama memberikan versi pom induk. Tapi jujur ​​ini adalah jawaban yang saya cari. Ini jauh lebih cepat daripada solusi yang disebutkan sebelumnya dan mudah untuk memodifikasinya untuk mendapatkan kejadian yang tepat. Untuk mendapatkan penggunaan kejadian kedua: grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pUntuk mendapatkan penggunaan kejadian ketiga: grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pdan seterusnya
Krzysztof Cieśliński

Anda mengasumsikan elemen versi adalah kejadian pertama, dan itu tidak berfungsi ketika asumsi tidak valid.
devildelta

3

Solusi all-in-one yang mudah dipahami yang menampilkan versi proyek pakar, dan menekan keluaran yang tidak diinginkan dari [INFO]danDownload pesan yang :

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

Hal yang sama, tetapi terbagi menjadi dua baris:

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

Output: 4.3-SNAPSHOT

Jadi, gunakan project.versionskrip bash sederhana Anda:

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

Solusi lain pada halaman ini tampaknya tidak menggabungkan semua trik menjadi satu.



3

Sejauh ini, ini adalah solusi bash cut and paste yang paling mudah:

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

itu bergema

1.4

2

Saya menemukan keseimbangan yang tepat untuk saya. Setelah mvn packageplugin maven-archiver dibuat target/maven-archiver/pom.propertiesdengan konten seperti ini

version=0.0.1-SNAPSHOT
groupId=somegroup
artifactId=someArtifact

dan saya menggunakan bash hanya untuk menjalankannya

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

kemudian

echo $version
0.0.1-SNAPSHOT

Tentu saja ini tidak aman sama sekali untuk mengeksekusi file ini, tetapi eksekusi dapat dengan mudah dikonversi menjadi skrip perl atau bash untuk membaca dan mengatur variabel lingkungan dari file itu.


1

Ini berfungsi untuk saya, offline dan tanpa tergantung pada mvn:

VERSION=$(grep --max-count=1 '<version>' <your_path>/pom.xml | awk -F '>' '{ print $2 }' | awk -F '<' '{ print $1 }')
echo $VERSION

1

Plugin Exec bekerja tanpa penguraian output karena output dapat diarahkan ke file dan disuntikkan kembali ke lingkungan kerja melalui plugin EnvInject:

masukkan deskripsi gambar di sini


1

Berdasarkan pertanyaan, saya menggunakan skrip ini di bawah ini untuk secara otomatis meningkatkan nomor versi saya di semua maven parent / submodules:

#!/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

0

Anda telah mvnmemberikan jawaban (seperti yang disarankan sebagian besar jawaban), atau mengekstrak jawaban dari pom.xml. Satu-satunya kelemahan dari pendekatan kedua adalah bahwa Anda dapat dengan mudah mengekstraksi nilai <version/>tag, tetapi itu akan bermakna hanya jika itu literal , yaitu, bukan properti Maven. Saya memilih pendekatan ini karena:

  • mvn adalah cara untuk verbose dan saya tidak suka memfilter outputnya.
  • Memulai mvnsangat lambat dibandingkan dengan membacapom.xml .
  • Saya selalu menggunakan nilai literal di <version/>.

mvn-versionadalah zshskrip shell yang digunakan xmlstarletuntuk membaca pom.xmldan mencetak versi proyek (jika ada) atau versi proyek induk (jika ada):

$ mvn-version .
1.0.0-SNAPSHOT

Keuntungannya adalah cara ini lebih cepat daripada berlari 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

Perbedaan pada mesin saya lebih besar dari dua urutan besarnya.


0

Saya membutuhkan persyaratan ini selama pekerjaan Travis saya tetapi dengan beberapa nilai. Saya mulai dengan solusi ini tetapi ketika menelepon beberapa waktu ini sangat lambat (saya butuh 5 expresions).

Saya menulis plugin maven sederhana untuk mengekstraksi nilai pom.xml ke file .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

Akan menghasilkan itu:

#!/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';

sekarang Anda cukup sumber file

source .target/ci-tools-env.sh

Selamat bersenang-senang.


-1

Saya menggunakan one-liner di shell unix saya ...

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

Anda dapat menyembunyikan baris ini dalam skrip shell atau sebagai alias.


-1

ini adalah suntingan dari atas

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

Saya mengujinya pada cmdline bekerja dengan baik

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

adalah versi lain yang sama. Saya memiliki kebutuhan untuk mendapatkan nomor versi dalam Jenkins CI di k8s tanpa mvn diinstal jadi ini sangat membantu

Terima kasih semuanya.


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

Saya hanya menambahkan sedpeningkatan filter kecil yang baru-baru ini saya terapkan untuk mengekstrak project.versiondari output pakar.


-2
VERSION=$(head -50 pom.xml | awk -F'>' '/SNAPSHOT/ {print $2}' | awk -F'<' '{print $1}')

Ini yang saya gunakan untuk mendapatkan nomor versi, berpikir akan ada cara pakar yang lebih baik untuk melakukannya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.