Maven proje sürümünü bash komut satırına alma


203

Daha önce Maven proje sürümünün komut satırından nasıl değiştirileceğine dair bir soru yayınladım ve bu da beni yeni bir soruna götürdü .

Daha önce, sürümün komut satırından (bash) grep ve ayrıştırması kolay bir özellik olarak saklandığından sürüm numarasını alabildim. Şimdi pom.xml öğesi bunun için kullanıldığına göre, tüm bağımlılıklar ve belki de bazıları da bunu kullandığından artık benzersiz değil. Ben xml veya bazı çok bağlam-bilinçli sed komut ayrıştırmak için harici araçlar olmadan bir bash betiği ile mevcut sürüm numarasını almak için bir yol olduğunu düşünüyorum .

Benim düşüncemdeki en temiz çözüm Maven'in bu sürüm bilgilerini dağıtması olacaktır. Farklı özellikleri almak için özel bir maven eklentisi yazmayı düşünüyordum ama önce burada soracağımı düşündüm.

Peki, ${project.version}komut satırının değerini almanın kolay bir yolu var mı? Şimdiden teşekkürler.

Çözüm

Yardım için teşekkürler. Ben cddizine manuel olarak vardı ama bu kolayca yapılabilir. Benim bash senaryomda var

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

Bu da bana ilerleyebileceğim güncel sürümü veriyor. Selamlamak daha kolay olabilir, ancak olabildiğince sağlam olmasını istediğimi düşündüm, bu yüzden bir sayı ile başlayan ilk satırdan memnunum ve bunu bir sürüm numarası olarak ele almaya çalışıyorum.

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

Ve bunu sadece arayarak kullanıyorum

new_version=$(advance_version $version)

Umarım bu birine yardımcı olur.


1
Çözüm, sed ifadesini bitirmek için bir 'kaçırıyor gibi görünüyor.
nawroth

Hangi sed exp? Fark edemiyorum.
mkko

1
hızlı yürütme için bir mvn -o yap
Nathan Bubna

2
Bu karmaşık sed ifadesini basit bir grep -e '^[[:digit:]]'
bpedman

2
@NathanBubna tarafından önerilen şekilde -o kullanırsanız, maven 'çevrimdışı' moduna geçirilir. Eğer maven yardım eklentisine ve bağımlı kavanozlara indirmediyseniz, derleme başarısız olacaktır. Bunun için biraz yanmış, umarım başka birine yardımcı olur.
phillipuniverse

Yanıtlar:


219

Maven Yardım Eklenti nasılsa zaten bunun için bir şeyler öneriyor:

  • help:evaluate Etkileşimli modda kullanıcı tarafından verilen Maven ifadelerini değerlendirir.

Bunu almak için komut satırında nasıl çağırırsınız ${project.version}:

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

8
Tamam teşekkürler. Bence bu temiz bir çözüme en yakın olacağım. Maven çıktısını nasıl bastırabilirim ve bu [INFO]mesajları nasıl filtreleyebilirim ? Maven için bir anahtar bulamadım. Aksi takdirde, sürüm numarasını ayrıştırmak için bazı komut satırı komut dosyaları ekleyeceğim.
mkko

80
Tüm günlük kaydını (BİLGİ, UYARI vb.) Ve 'İndir' iletilerini kaldırıyorummvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick

13
maven'den daha az ayrıntılı bir şey beklemezsiniz
Andy

24
İşte benim tercih ettiğim bir yaklaşım:printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
ash

40
@montoyaed yayınlanmıştır iyi yanıtı basitçe mvn help:evaluate -Dexpression=project.version -q -DforceStdout. Bash kullanımında bir değişkeni yakalamak içinversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Sebastian Thomschke

200

Tom'un Exec Maven Eklentisi ile çözümü çok daha iyidir, ancak olması gerekenden daha karmaşıktır. Benim için bu kadar basit:

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

30
Bence bu en kolay yol, çünkü grep veya benzeri şeylerin kullanımı anlamına gelmiyor. Hızlı not: biraz daha kısa yapabilirsiniz:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
scrutari

1
GroupId, artifactId ve version yazdırmak istediğim için bu çözüm benim için iyi çalıştı -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 shrug henüz benim için çalışmayan başka bir cevap, oh iyi
cbmanica

Teşekkür ederim bu kırılgan grep / sed komutları veya benzeri uygulamak gerektirmediği için şimdiye kadar gördüğüm en iyi çözüm
Mike76

Nedirset -o errexit
theonlygusti

80

Biraz araştırma yaptım ve aşağıdakileri buldum:

  1. Maven, DevOps araçlarıyla entegrasyonun CLI araçlarıyla ilgili bazı iyi uygulamaları izlememesi nedeniyle kolay olmadığı için suçlandı. (ref: https://youtu.be/1ILEw6Qca3U?t=372 )

  2. Önceki iddiadan esinlenerek, maven'in kaynak kodunun yanı sıra maven-help-plugin'e de bakmaya karar verdim. Biraz maven'in -q anahtarını (sürüm 3.5.3 kullanıyorum) düzelttikleri anlaşılıyor, bu yüzden şimdi geçerseniz, maven'in kullanılmasını engelleyen tüm can sıkıcı mantıksız günlük kayıtlarını alamayacaksınız otomatik komut dosyaları içinde. Yani böyle bir şey kullanabilmelisiniz:

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

    Sorun, bu komutun hiçbir şey yazdırmamasıdır, çünkü varsayılan olarak yardım eklentisi -q anahtarı tarafından susturulan günlükçiden çıkar. (Eklentinin mevcut en son sürümü 3 Haziran 2018'de 3.1.0 yayımlandı)

  3. Karl Heinz Marbaise ( https://github.com/khmarbaise ), aşağıdaki şekilde çağırmanıza izin veren isteğe bağlı bir parametre ekleyerek düzeltti:

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

    Taahhüt açıklaması şu adreste bulunabilir: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )


2
Bu benim tercih ettiğim çözüm olacak ve resmi yardım sayfalarında da bahsedilecek . Ancak, benim için işe yaramıyor. Maven v3.5.3 ile MacOS'tayım. -qAnahtarı kullanmadığımda, sürümü doğru bir şekilde yazdırıyor (günlük satırları arasında). Herhangi bir fikir?
gucce

3
Bu kabul edilen cevap olmalı. Windows ve Linux'ta çalışır (Max OSX'i denemedim) ve basit. Teşekkür ederim.
trash80

1
@montoyaedu Yanıt vermediğim için üzgünüz. Bu arada, -qanahtarla iyi çalışan 3.5.4 maven'e güncelledim .
gucce

1
@gucce Kullanılan maven sürümünün bunu etkilediğini doğrulayabilirim: 3.5.2 (debian 9'daki paket sürümü) ile çıktı -q -DforceStdoutboştu, hatta pluginManagement sürüm 3.1.0'ın kullanıldığından emin olun); maven 3.5.4 maven sürümü ile maven sarıcı yapılandırılmış ve düzgün çalıştı
Gorkk

3
Son olarak, 2019 için grep olmadan pratik bir çözüm - (bu kabul edilen cevap olmalı). İle İşleri CI dostu sürümleri de - 3.3.9 üzerinde test, 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
daha hızlı yürütme için mvn -o yap
Nathan Bubna

1
Aşağıdaki 'İndirilenler:' satırlarını da filtreleyen cevabım (quickshiftin) bölümüne bakın.
quickshiftin

10
@NathanBubna tarafından önerilen şekilde -o kullanırsanız, maven 'çevrimdışı' moduna geçirilir. Eğer maven yardım eklentisine ve bağımlı kavanozlara indirmediyseniz, derleme başarısız olacaktır. Bunun için biraz yanmış, umarım başka birine yardımcı olur.
phillipuniverse

Ayrıca ekleyebilirsiniz 2> /dev/nullgibi ekleyebilirsinizPicked up _JAVA_OPTIONS:
Jakub Bochenski

2
Windows'da, komutun sonunu ile değiştirin | findstr /v "[".
Tunaki

39

En iyi cevap bence oldukça çöp, maven konsolu çıkışını kesmek için bir grup grep kullanmanız gerekiyor. Neden iş için doğru aleti kullanmıyorsunuz? XML veri yapısına erişmek için amaçlanan yöntem olduğundan, xpath sözdizimini kullanmak sürüm numarasını almak için en iyi yaklaşımdır. Aşağıdaki ifade, öğelerin "yerel adı" kullanılarak pom'a geçilir, diğer bir deyişle xml'de bulunabilen veya bulunmayan ad alanı bildirimlerini yok sayar.

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

@bobmarksie Ben ikinci; maven kullanmak ve regexp ile çıktı ovmak acı vericidir.
mhvelplund

3
Bir ebeveyn pom'dan miras kalan bir projeye ne dersiniz?
Wes

2
"Neden iş için doğru aleti kullanmıyorsunuz?" IE! Maven?
jeremyjjbrown

Kullanmanın mvndoğru yaklaşım olduğunu ve execeklentinin gerçekten iyi çalıştığını anlıyorum, ancak tüm mvn çözümleri çözmek zorunda ve bağımlılık çözünürlüğünün işe yaramayacağı bir yapı hattını önyüklemeye çalışıyorum, bu yüzden execyaklaşımı bu çözümle değiştireceğim. Neyse ki, ebeveynlerden miras alınan sürümler hakkında endişelenmem gerekmiyor.
haridsv

Bu, ${revision}örneğin örneğin bir özellik olduğu ci dostu sürüm ile çalışmaz . Ref. maven.apache.org/maven-ci-friendly.html
Ed Randall

30

Bu, günlük girişlerini çıkıştan ayırma ihtiyacını önler:

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

Bu kod soruyu cevaplayabilirken, soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini önemli ölçüde artıracaktır. Lütfen biraz açıklama eklemek için cevabınızı düzenleyin .
Toby Speight

1
Bu yaklaşım için mvn sonra "-q" koymak gerektiğini düşünüyorum.
Rudge

Bu, kabul edilen çözümden daha iyidir; maven gürültülü çıkışını filtrelemeye gerek yok.
Willian Mitsuda

20

Bulduğum en temiz çözüm :

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

Avantajları:

  • Bu, tüm işletim sistemlerinde ve tüm kabuklarda iyi çalışır .
  • Harici aletlere gerek yok!
  • [önemli] Proje sürümü üst öğeden devralınsa bile bu işe yarar pom.xml

Not:

  • maven-help-pluginsürümü 3.2.0(ve üstü) forceStdoutseçeneği vardır. 3.2.0Yukarıdaki komutta , varsa yapay nesne için mevcut mvn-help-plugin sürümleri listesinden daha yeni bir sürümle değiştirebilirsiniz .
  • Seçenek -qmesajları ayrıntılı bastırır ( [INFO], [WARN]vs.)

Getirmek istiyorsanız groupIdve bu yanıtı daartifactId kontrol edin .


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

Python 2.5 veya daha büyük bir süreye sahip olduğunuz sürece, bu işe yaramalıdır. Bundan daha düşük bir sürüme python-lxmlsahipseniz, içe aktarmayı yükleyin ve lxml.etree olarak değiştirin. Bu yöntem hızlıdır ve ek eklentilerin indirilmesini gerektirmez. Ayrıştırmam gereken dosyalar gibi xmllint ile doğrulanmayan hatalı biçimlendirilmiş pom.xml dosyalarında da çalışır. Mac ve Linux'ta test edilmiştir.


12

Buradaki diğer cevaplardan bazılarını kullanırken yan davalara girmeye devam ettim, işte başka bir alternatif.

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

Sürümü geçici bir dosyaya yazmanın sakıncası yoksa, benim için iyi çalışan başka bir çözüm (grep / sed olmadan) var. ( DÜZENLEME : rjrjr'ın geçici dosya sıkıntısı olmadan çok daha basit bir çözüm için cevabına bakın )

Ben ikili ile birlikte Exec Maven Eklentisi kullanıyorum echo. Maven Yardım Eklentisinin aksine, Exec Eklentisi, grep / sed'i atlamak için kullanılabilen bir dosyaya çıktı yönlendirmesine izin verir ve çok satırlı sürüm dizeleri (sürüm etiketinde CDATA bloğu ile) gibi garip şeyleri ayrıştırmayı bile mümkün kılar, en azından bir dereceye kadar.

#!/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
Bu, yardımcı eklentiden çok daha iyi bir çözümdür ve tüm bu i / o'lara ihtiyacınız yoktur. Sadece -q bayrağı ekleyin ve tek çıkış sürüm olacaktır. Yani: mvn -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' --non-özyinelemeli org.codehaus.mojo: exec-maven-eklenti: 1.3.1: exec
rjrjr

rjrjr: Harika! Burada bahsetmem gereken tek şey hata işleme: mvn başarısız olursa, geçersiz bir sürüm dizesi alırsınız. Bu nedenle, mvn dönüş kodunu veya dizenin kendisini kontrol etmek gibi bir doğrulama gerekir.
Tom

6

Sadece kayıt için, Maven'in Basit SLF4J günlüğünü doğrudan komut satırında yapılandırarak yalnızca yapılandırarak ihtiyacımız olanı çıkaracak şekilde yapılandırmak mümkündür:

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

http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html adresinde belgelendiği gibi

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

Sonuç olarak, basit bir şekilde çalışabilir tail -1ve şunları elde edebilir:

$ 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

Bunun bir astar olduğunu unutmayın. MAVEN_OPTSyalnızca bu özel mvnuygulama için yeniden yazılıyor.


5

Downloaded:Çıktının içinde, orijinal görevimi bozan bazı sahte çizgiler fark ettim . İşte yerleştiğim filtre; Umarım yardımcı olur!

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

DÜZENLE

Neden% 100 emin değilim, ancak bunu Jenkins'te bir post-build betiği ile çalıştırırken, çıktı [INFO]version, örneğin çıktı [INFO]0.3.2.

Çıktıyı bir dosyaya döktüm ve ilk filtremden doğrudan BASH'den çalıştırdım, iyi çalışıyor .., bu yüzden tekrar Jenkins arazisinde neler olduğundan emin değilim.

Jenkins'te% 100 almak için bir takip sedfiltresi ekledim ; işte en son benim

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

DÜZENLE

Son bir not burada .. öğrendim tredildi hala gibi şeyler sonuçlanan /r/n0.3.2(Jenkins yoluyla çalıştırırken tekrar okunur). Geçti awkve sorun ortadan kalktı! Son çalışma sonucum

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

Sadece basit bir maven çözümü

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

Ve bonus puanlar için bir sürümün parçası ayrıştırıldı

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

Kısa bir süre önce bu kesin sorunu çözen Release Candidate Maven eklentisini geliştirdim, böylece herhangi bir hacky kabuk komut dosyasına başvurmanız vemaven-help-plugin .

Örneğin, Maven projenizin sürümünü bir terminale yazdırmak için şunu çalıştırın:

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

aşağıdakine benzer çıktılar verir maven-help-plugin:

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

Bununla birlikte, isteğe bağlı bir çıktı biçimi de belirtebilirsiniz (böylece sürümün TeamCity gibi bir CI sunucusu tarafından günlükten alınabilmesi için ):

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

Sonuç:

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

Bir dosyaya (böylece gibi bir CI sunucusu olduğu çıktı kaydetmek için Jenkins olabilir kullanmak ):

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

Ortaya çıkan version.propertiesdosya aşağıdaki gibi görünecektir:

PROJECT_VERSION=1.0.0-SNAPSHOT

Yukarıdakilerin hepsinde, Sürüm Adayı da sürümü ayarlamanızı sağlar projenizin (muhtemelen CI sunucunuzda yapacağınız bir şey) POM'nizde tanımladığınız API sürümüne göre .

Maven yaşam döngüsünün bir parçası olarak Sürüm Adayı örneğinin kullanıldığını görmek isterseniz, pom.xmldiğer açık kaynaklı projeme - Jenkins için Monitor'u inceleyin .


5

Maven'e ihtiyaç duymayan bir seçenek de var:

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

Bu pom'daki sadece ilk olayı gösterir. Benim durumumda ilk kez ebeveyn pom versiyonu verir. Ama dürüst olmak gerekirse aradığım cevap bu. Daha önce bahsedilen çözümlerden çok daha hızlıdır ve uygun oluşum elde etmek için değiştirmek kolaydır. İkinci olayı almak için kullanın: grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pÜçüncü olayı almak için şunu kullanın: grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pvb.
Krzysztof Cieśliński

Sürüm öğesinin ilk oluşum olduğunu ve varsayım geçersiz olduğunda çalışmadığını varsayıyorsunuz.
devildelta

3

Maven proje sürümünü çıkaran, çıktıların [INFO]ve Downloadiletilerin dışına çıkan çıktıları bastıran anlaşılması kolay hepsi bir arada çözüm :

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

Aynı şey, ama iki satıra bölünmüş:

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

Çıktılar: 4.3-SNAPSHOT

Yani, project.versionbasit bir bash komut dosyasında kullanarak :

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

Bu sayfadaki diğer çözümler tüm hileleri bir araya getirmedi.



3

Bu, en kolay bash kesme ve yapıştırma çözümüdür:

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

yankılanıyor

1.4

2

Benim için doğru dengeyi buldum. mvn packageMaven-archiver eklentisi target/maven-archiver/pom.propertiesböyle içeriklerle oluşturulduktan sonra

version=0.0.1-SNAPSHOT
groupId=somegroup
artifactId=someArtifact

ve bash'ı sadece yürütmek için kullanıyorum

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

sonra

echo $version
0.0.1-SNAPSHOT

Tabii ki bu, bu dosyayı yürütmek için güvenli değildir, ancak yürütme, bu dosyadaki ortam değişkenini okumak ve ayarlamak için kolayca perl veya bash komut dosyasına dönüştürülebilir.


1

Bu benim için, çevrimdışı ve mvn bağlı olmadan çalıştı:

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

1

Exec eklentisi, çıktı ayrıştırılmadan çalışır çünkü çıktı EnvInject eklentisi aracılığıyla dosyaya yönlendirilebilir ve iş ortamına geri enjekte edilebilir:

resim açıklamasını buraya girin


1

Soruya dayanarak, tüm maven ebeveyn / alt modüllerinde sürüm numaramı otomatik olarak artırmak için aşağıdaki bu komut dosyasını kullanıyorum:

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

Ya size mvncevabı verdiniz (çoğu cevabın önerdiği gibi) ya da cevabı pom.xml. İkinci yaklaşımın tek dezavantajı, <version/>etiketin değerini çok kolay bir şekilde ayıklayabilmenizdir , ancak yalnızca gerçek bir kelime , yani bir Maven mülkü değilse anlamlı olacaktır . Yine de bu yaklaşımı seçtim çünkü:

  • mvn ayrıntılı bir yol ve sadece çıkışını filtrelemeyi sevmiyorum.
  • Başlangıç mvn, okumaya kıyasla çok yavaşpom.xml .
  • İçinde her zaman değişmez değerler kullanırım <version/>.

mvn-versionprojenin sürümünü (varsa) veya üst projenin sürümünü (varsa) okumak ve yazdırmak için zshkullanılan bir kabuk komut dosyasıdır :xmlstarletpom.xml

$ mvn-version .
1.0.0-SNAPSHOT

Avantajı olmasıdır yolu çalışan daha hızlı 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

Makinemdeki fark iki büyüklükten daha büyük.


0

Travis işim sırasında tam olarak bu gereksinime ihtiyacım var ama birden fazla değerle. Bu çözümle başlıyorum ama birden fazla zaman çağırırken bu çok yavaş (5 ifade gerekir).

Pom.xml'nin değerlerini .sh dosyasına ayıklamak için basit bir maven eklentisi yazdım.

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

Bunu üretecek:

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

şimdi dosyayı kolayca kaynaklayabilirsiniz

source .target/ci-tools-env.sh

İyi eğlenceler.


-1

Unix kabuğumda bir astar kullanıyorum ...

kedi pom.xml | grep "" | kafa -n 1 | sed -e "s / sürüm // g" | sed -e "s / \ s * [<> /] * // g"

Bu satırı bir kabuk komut dosyasında veya takma ad olarak gizleyebilirsiniz.


-1

bu yukarıdan bir düzenleme

kedi pom.xml | grep "" | kafa -n 1 | sed -e "s / sürüm // g" | sed -e "s / \ s * [<> /] * // g"

Ben cmdline iyi test üzerinde test

grep "" pom.xml | kafa -n 1 | sed -e "s / sürüm // g" | sed -e "s / \ s * [<> /] * // g"

aynı başka bir sürümüdür. MVn yüklü olmadan k8s Jenkins CI sürüm numarasını almak için bir ihtiyaç var bu yüzden bu en yararlı

hepinize teşekkürler.


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

Sadece sedson zamanlarda project.versionmaven çıktısını ayıklamak için uyguladığım küçük filtre iyileştirmesi ekliyorum .


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

Bu, sürüm numarasını almak için kullandığım şeydi, bunu yapmanın daha iyi bir yol olacağını düşündüm

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.