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 cd
direktori 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.
sumber
grep -e '^[[:digit:]]'
Jawaban:
The Maven Bantuan Plugin entah bagaimana sudah mengusulkan sesuatu untuk ini:
Ini adalah bagaimana Anda akan memintanya di baris perintah untuk mendapatkan
${project.version}
:sumber
[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.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
. Untuk menangkapnya dalam sebuah variabel di Bash gunakanversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Solusi Tom dengan Exec Maven Plugin jauh lebih baik, tetapi masih lebih rumit dari yang seharusnya. Bagi saya itu sesederhana:
sumber
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
angkat bahu jawaban lain yang tidak berhasil untuk saya, oh wellset -o errexit
Saya telah melakukan beberapa penelitian dan menemukan yang berikut:
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 )
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:
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)
Karl Heinz Marbaise ( https://github.com/khmarbaise ) memperbaikinya dengan menambahkan parameter opsional yang memungkinkan Anda memanggilnya dengan cara berikut:
Deskripsi komit tersedia di: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )
sumber
-q
saklar itu mencetak versi dengan benar (di antara baris log). Ada ide?-q
saklar.-q -DforceStdout
kosong, 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 benarsumber
2> /dev/null
karena jika tidak, Anda bisa mendapatkanPicked up _JAVA_OPTIONS:
| findstr /v "["
.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.
sumber
mvn
adalah pendekatan yang tepat danexec
plugin 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 menggantiexec
pendekatan dengan solusi ini. Untungnya, saya tidak perlu khawatir tentang versi yang diwarisi dari orang tua.${revision}
misalnya. Ref. maven.apache.org/maven-ci-friendly.htmlIni akan menghindari keharusan untuk mengambil entri log dari output:
sumber
Ini adalah solusi terbersih yang saya temukan:
Keuntungan:
pom.xml
catatan:
maven-help-plugin
versi3.2.0
(dan di atas) memilikiforceStdout
opsi. Anda dapat mengganti3.2.0
perintah di atas dengan versi yang lebih baru dari daftar versi mvn-help-plugin yang tersedia dari artifactory, jika tersedia.-q
menekan pesan verbal ([INFO]
,[WARN]
dll.)Jika Anda ingin mengambil
groupId
danartifactId
juga, periksa jawaban ini .sumber
Selama Anda memiliki python 2.5 atau lebih besar, ini akan berfungsi. Jika Anda memiliki versi yang lebih rendah dari itu, instal
python-lxml
dan 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.sumber
Saya terus mengalami kasus sampingan ketika menggunakan beberapa jawaban lain di sini, jadi inilah alternatif lain.
sumber
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
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
echo
biner. 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.sumber
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
danorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO
seperti yang didokumentasikan di http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Sebagai hasilnya, seseorang dapat berjalan dengan sederhana
tail -1
dan mendapatkan:Perhatikan bahwa ini adalah satu garis.
MAVEN_OPTS
sedang ditulis ulang hanya untukmvn
eksekusi khusus ini .sumber
Saya perhatikan beberapa
Downloaded:
baris palsu muncul di output yang melanggar tugas asli saya. Inilah filter yang telah saya pilih; semoga membantu!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
sed
filter tindak lanjut ; ini yang terbaruEDIT
Satu catatan terakhir di sini .. saya menemukan
tr
itu masih menghasilkan hal-hal seperti/r/n0.3.2
(lagi hanya ketika menjalankan melalui Jenkins). Beralih keawk
dan masalahnya telah hilang! Hasil kerja terakhir sayasumber
Satu-satunya solusi pakar sederhana
Dan untuk poin bonus diuraikan bagian dari versi
sumber
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:
yang menghasilkan output yang mirip dengan
maven-help-plugin
:Namun, Anda juga dapat menentukan format output sewenang - wenang (sehingga versi dapat diambil dari log oleh server CI seperti TeamCity ):
Yang mengakibatkan:
Untuk menyimpan output ke file (sehingga server CI seperti Jenkins dapat menggunakannya ):
File yang dihasilkan
version.properties
akan terlihat sebagai berikut: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.xml
proyek sumber terbuka saya yang lain - Build Monitor for Jenkins .sumber
Ada juga satu opsi tanpa perlu Maven:
sumber
grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p
Untuk mendapatkan penggunaan kejadian ketiga:grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p
dan seterusnyaSolusi all-in-one yang mudah dipahami yang menampilkan versi proyek pakar, dan menekan keluaran yang tidak diinginkan dari
[INFO]
danDownload
pesan yang :Hal yang sama, tetapi terbagi menjadi dua baris:
Output:
4.3-SNAPSHOT
Jadi, gunakan
project.version
skrip bash sederhana Anda:Solusi lain pada halaman ini tampaknya tidak menggabungkan semua trik menjadi satu.
sumber
Seharusnya lebih mudah karena bug ini diperbaiki di maven-help-plugin 3.0.0: MPH-99 Evaluate tidak memiliki output dalam mode senyap .
sumber
Sejauh ini, ini adalah solusi bash cut and paste yang paling mudah:
itu bergema
sumber
Saya menemukan keseimbangan yang tepat untuk saya. Setelah
mvn package
plugin maven-archiver dibuattarget/maven-archiver/pom.properties
dengan konten seperti inidan saya menggunakan bash hanya untuk menjalankannya
kemudian
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.
sumber
Ini berfungsi untuk saya, offline dan tanpa tergantung pada mvn:
sumber
Plugin Exec bekerja tanpa penguraian output karena output dapat diarahkan ke file dan disuntikkan kembali ke lingkungan kerja melalui plugin EnvInject:
sumber
Berdasarkan pertanyaan, saya menggunakan skrip ini di bawah ini untuk secara otomatis meningkatkan nomor versi saya di semua maven parent / submodules:
sumber
Anda telah
mvn
memberikan jawaban (seperti yang disarankan sebagian besar jawaban), atau mengekstrak jawaban daripom.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.mvn
sangat lambat dibandingkan dengan membacapom.xml
.<version/>
.mvn-version
adalahzsh
skrip shell yang digunakanxmlstarlet
untuk membacapom.xml
dan mencetak versi proyek (jika ada) atau versi proyek induk (jika ada):Keuntungannya adalah cara ini lebih cepat daripada berlari
mvn
:Perbedaan pada mesin saya lebih besar dari dua urutan besarnya.
sumber
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
Akan menghasilkan itu:
sekarang Anda cukup sumber file
Selamat bersenang-senang.
sumber
Saya menggunakan one-liner di shell unix saya ...
Anda dapat menyembunyikan baris ini dalam skrip shell atau sebagai alias.
sumber
ini adalah suntingan dari atas
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.
sumber
Saya hanya menambahkan
sed
peningkatan filter kecil yang baru-baru ini saya terapkan untuk mengekstrakproject.version
dari output pakar.sumber
Ini yang saya gunakan untuk mendapatkan nomor versi, berpikir akan ada cara pakar yang lebih baik untuk melakukannya
sumber