วิธีรับรุ่น Maven ของโครงการไปที่บรรทัดคำสั่ง bash


203

ก่อนหน้านี้ฉันออกคำถามเกี่ยวกับวิธีการเปลี่ยนเวอร์ชัน Maven ของโครงการจากบรรทัดคำสั่งซึ่งนำฉันไปสู่ปัญหาใหม่

ก่อนหน้านี้ฉันสามารถรับหมายเลขเวอร์ชันได้เนื่องจากเวอร์ชันถูกเก็บเป็นคุณสมบัติที่ง่ายต่อการ grep และแยกวิเคราะห์จากบรรทัดคำสั่ง (bash) ตอนนี้องค์ประกอบ pom.xml ถูกใช้สำหรับสิ่งนี้มันไม่ได้เป็นเอกลักษณ์อีกต่อไปตั้งแต่การอ้างอิงทั้งหมดและบางทีบางคนก็ใช้สิ่งนี้เช่นกัน ฉันคิดว่าไม่มีวิธีรับหมายเลขเวอร์ชันปัจจุบันด้วยสคริปต์ทุบตีโดยไม่มีเครื่องมือภายนอกสำหรับการแยกวิเคราะห์ xml หรือคำสั่ง sed ที่รับรู้บริบทมาก

ทางออกที่สะอาดที่สุดใน Verifynion ของฉันคือ Maven จะแจกข้อมูลรุ่นนี้ ฉันคิดว่าจะเขียนปลั๊กอิน maven ที่กำหนดเองเพื่อดึงคุณสมบัติที่แตกต่าง แต่ฉันคิดว่าฉันจะถามที่นี่ก่อน

ดังนั้นมีวิธีง่ายๆในการรับค่าของ${project.version}บรรทัดคำสั่งหรือไม่ ขอบคุณล่วงหน้า.

สารละลาย

ขอขอบคุณสำหรับความช่วยเหลือ. ฉันต้องไปcdที่ไดเรกทอรีด้วยตนเอง แต่สามารถทำได้อย่างง่ายดาย ในทุบตีสคริปต์ของฉันฉันมี

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

ซึ่งให้ฉันเวอร์ชันปัจจุบันที่ฉันสามารถล่วงหน้า การ grepping อาจจะง่ายกว่า แต่ฉันคิดว่าฉันต้องการความแข็งแกร่งที่สุดเท่าที่จะเป็นไปได้ดังนั้นฉันจึงพอใจกับบรรทัดแรกที่เริ่มต้นด้วยตัวเลขและพยายามจัดการมันเป็นหมายเลขเวอร์ชัน

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

และฉันใช้สิ่งนี้เพียงแค่โทรหา

new_version=$(advance_version $version)

หวังว่านี่จะช่วยใครซักคน


1
การแก้ปัญหาดูเหมือนจะพลาด 'เพื่อเสร็จสิ้นการแสดงออก sed
nawroth

รุ่นไหนที่มีประสบการณ์ ฉันไม่สามารถสังเกตเห็นได้
mkko

1
ทำให้เป็น mvn -o เพื่อการดำเนินการที่รวดเร็วยิ่งขึ้น
Nathan Bubna

2
คุณสามารถเปลี่ยนที่ซับซ้อนแสดงออก sed กับง่ายgrep -e '^[[:digit:]]'
bpedman

2
หากคุณใช้ -o ตามคำแนะนำของ @NathanBubna สิ่งนั้นจะทำให้ maven อยู่ในโหมด 'ออฟไลน์' หากคุณยังไม่มีปลั๊กอินช่วยเหลือ maven และดาวน์โหลดขวดที่ต้องพึ่งพาการสร้างจะล้มเหลว ถูกเผาโดยสิ่งนั้นสักครู่หวังว่าจะช่วยคนอื่นได้
phillipuniverse

คำตอบ:


219

ช่วยเหลือปลั๊กอิน Mavenเป็นอย่างใดแล้วเสนอบางสิ่งบางอย่างสำหรับการนี้:

  • help:evaluate ประเมินการแสดงออก Maven ที่กำหนดโดยผู้ใช้ในโหมดโต้ตอบ

นี่คือวิธีที่คุณจะเรียกใช้บนบรรทัดคำสั่งเพื่อรับ${project.version}:

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

8
โอเคขอบคุณ. ฉันคิดว่านี่เป็นวิธีที่ใกล้เคียงที่สุดที่ฉันจะได้รับโซลูชั่นที่สะอาด ความคิดใด ๆ ที่ฉันสามารถกดเอาท์พุท maven และกรอง[INFO]ข้อความเหล่านั้นได้อย่างไร ฉันไม่พบสวิตช์สำหรับ Maven มิฉะนั้นฉันจะเพิ่มสคริปต์บรรทัดคำสั่งเพื่อแยกวิเคราะห์หมายเลขรุ่น
mkko

80
ฉันลบการบันทึกทั้งหมด (INFO, WARNING, etc) และข้อความ 'ดาวน์โหลด' ด้วยmvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick

13
จะไม่คาดหวังอะไร verbose น้อยจาก Maven
Andy

24
นี่เป็นวิธีที่ฉันโปรดปราน:printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
Ash

40
@montoyaed โพสต์ตอบที่ดีที่สุดmvn help:evaluate -Dexpression=project.version -q -DforceStdoutซึ่งก็คือ เพื่อจับมันในตัวแปรในการใช้ Bashversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
เซบาสเตียน Thomschke

200

วิธีแก้ปัญหาของทอมกับปลั๊กอิน Exec Mavenนั้นดีกว่ามาก แต่ก็ยังซับซ้อนกว่าที่ควรจะเป็น สำหรับฉันมันง่ายเหมือน:

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

30
ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดเพราะไม่ได้หมายถึงการใช้ grep หรือสิ่งที่คล้ายกัน Quick note: คุณอาจทำให้เตี้ยกว่านี้ได้บ้าง:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
scrutari

1
การแก้ปัญหานี้ทำงานได้ดีสำหรับฉันเป็นฉันอยากจะพิมพ์ groupID, artifactId และรุ่น -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 ยักคำตอบอื่นที่ไม่ได้ผลสำหรับฉันดี
cbmanica

ขอบคุณนี่เป็นทางออกที่ดีที่สุดที่ฉันเคยเห็นเพราะมันไม่จำเป็นต้องใช้คำสั่ง grep / sed ที่เปราะบางหรือคล้ายกัน
Mike76

คืออะไรset -o errexit
theonlygusti

80

ฉันได้ทำการวิจัยและพบสิ่งต่อไปนี้:

  1. Maven ถูกตำหนิเนื่องจากการรวมเข้ากับเครื่องมือ DevOps ไม่ใช่เรื่องง่ายเนื่องจากข้อเท็จจริงที่ว่ามันไม่เป็นไปตามแนวปฏิบัติที่ดีเกี่ยวกับเครื่องมือ CLI (อ้างอิง: https://youtu.be/1ILEw6Qca3U?t=372 )

  2. จากแรงบันดาลใจในการยืนยันก่อนหน้านี้ฉันตัดสินใจที่จะดูซอร์สโค้ดของ Maven รวมถึง maven-help-plugin ดูเหมือนว่าพวกเขาได้แก้ไขสวิตช์ -q ของ maven เล็กน้อย (ฉันใช้รุ่น 3.5.3) ดังนั้นตอนนี้ถ้าคุณผ่านมันไปคุณจะไม่ได้รับข้อมูลการบันทึกที่ไม่สมเหตุสมผลที่น่ารำคาญที่ป้องกันไม่ให้ใช้งาน maven ภายในสคริปต์อัตโนมัติ ดังนั้นคุณควรจะใช้สิ่งนี้:

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

    ปัญหาคือว่าคำสั่งนี้ไม่พิมพ์อะไรเลยเพราะโดยปกติแล้วปลั๊กอินช่วยเหลือจะแสดงผลผ่านตัวบันทึกซึ่งถูกปิดเสียงโดยสวิตช์ -q (ปลั๊กอินรุ่นล่าสุดที่มีให้บริการคือ 3.1.0 เผยแพร่ในเดือนมิถุนายน 3 2018)

  3. Karl Heinz Marbaise ( https://github.com/khmarbaise ) แก้ไขโดยการเพิ่มพารามิเตอร์ตัวเลือกที่ช่วยให้คุณสามารถเรียกมันได้ด้วยวิธีต่อไปนี้:

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

    คำอธิบายการส่งมอบมีอยู่ที่: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )


2
นี้จะเป็นวิธีการแก้ปัญหาที่ต้องการของฉันและยังเป็นที่กล่าวถึงอย่างเป็นทางการในหน้าความช่วยเหลือ อย่างไรก็ตามมันไม่ได้ผลสำหรับฉัน ฉันใช้ MacOS กับ Maven v3.5.3 เมื่อฉันไม่ได้ใช้-qสวิตช์มันจะพิมพ์เวอร์ชั่นออกมาอย่างถูกต้อง (ระหว่างบรรทัดบันทึก) ความคิดใด ๆ
gucce

3
นี่ควรเป็นคำตอบที่ยอมรับได้ มันใช้งานได้ใน Windows และ Linux (ฉันไม่ได้ลอง Max OSX) และมันก็ง่าย ขอบคุณ.
trash80

1
@montoyaedu ขออภัยที่ไม่ตอบสนอง ในระหว่างนี้ฉันได้อัปเดตเป็น maven 3.5.4 ซึ่งทำงานได้ดีกับ-qสวิตช์
gucce

1
@ gucce ฉันสามารถยืนยันได้ว่าเวอร์ชัน maven ที่ใช้มีผลกับสิ่งนี้: ด้วย 3.5.2 (เวอร์ชันแพ็คเกจบนเดเบียน 9) เอาต์พุตที่-q -DforceStdoutว่างเปล่าแม้จะมั่นใจได้ว่าเวอร์ชัน 3.1.0 ของปลั๊กอินถูกใช้กับ pluginManagement); ฉันกำหนดค่าเสื้อคลุม Maven กับรุ่น 3.5.4 ของผู้เชี่ยวชาญและจะทำงานได้อย่างถูกต้อง
Gorkk

3
ในที่สุดการแก้ปัญหาในทางปฏิบัติโดยไม่ต้อง grep สำหรับปี 2019 - (นี่ควรเป็นคำตอบที่ยอมรับได้) ทำงานร่วมกับเวอร์ชันที่เป็นมิตรกับCI ได้เช่นกัน - ทดสอบในวันที่ 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
ทำให้ mvn -o นั้นทำงานได้เร็วขึ้น
Nathan Bubna

1
ดูคำตอบของฉัน (quickshiftin) ด้านล่างซึ่งตัวกรอง 'ดาวน์โหลด:' ด้วย
quickshiftin

10
หากคุณใช้ -o ตามคำแนะนำของ @NathanBubna สิ่งนั้นจะทำให้ maven อยู่ในโหมด 'ออฟไลน์' หากคุณยังไม่มีปลั๊กอินช่วยเหลือ maven และดาวน์โหลดขวดที่ต้องพึ่งพาการสร้างจะล้มเหลว ถูกเผาโดยสิ่งนั้นสักครู่หวังว่าจะช่วยคนอื่นได้
phillipuniverse

คุณอาจต้องการเพิ่ม2> /dev/nullเป็นอย่างอื่นคุณสามารถรับPicked up _JAVA_OPTIONS:
Jakub Bochenski

2
บน Windows, | findstr /v "["แทนที่ท้ายคำสั่งด้วย
Tunaki

39

คำตอบยอดนิยมคือขยะสวยในความคิดของคุณคุณต้องใช้ grep จำนวนมากเพื่อแฮ็คเอาท์พุทคอนโซล maven ทำไมไม่ใช้เครื่องมือที่เหมาะสมกับงาน? การใช้ xpath syntax เป็นวิธีที่ดีที่สุดในการดึงข้อมูลหมายเลขรุ่นเนื่องจากเป็นวิธีที่ต้องการในการเข้าถึงโครงสร้างข้อมูล XML นิพจน์ด้านล่างกำลังตรวจสอบ pom โดยใช้ "ชื่อโลคัล" ขององค์ประกอบหรือกล่าวอีกนัยหนึ่งโดยไม่สนใจการประกาศเนมสเปซซึ่งอาจมีหรือไม่มีอยู่ใน xml

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

@bobmarksie ฉันสองที่; ใช้ maven และขัดผลลัพธ์ด้วย regexp ของเจ็บปวด
mhvelplund

3
สิ่งที่เกี่ยวกับโครงการที่สืบทอดมาจาก pom ผู้ปกครอง
Wes

2
"ทำไมไม่ใช้เครื่องมือที่เหมาะสมกับงาน" IE! Maven?
jeremyjjbrown

ฉันเข้าใจว่าการใช้mvnเป็นวิธีการที่ถูกต้องและexecปลั๊กอินใช้งานได้จริง แต่โซลูชัน mvn ทั้งหมดต้องแก้ไขและฉันพยายามบูต bootstrap ไปป์ไลน์การสร้างที่การแก้ปัญหาการพึ่งพาไม่ได้ผลดังนั้นฉันจะแทนที่execแนวทางด้วยโซลูชันนี้ โชคดีที่ฉันไม่ต้องกังวลกับรุ่นที่สืบทอดจากผู้ปกครอง
27925

สิ่งนี้จะไม่ทำงานกับการกำหนดเวอร์ชัน ci-friendly ซึ่งเวอร์ชันเป็นคุณสมบัติ${revision}เช่น อ้าง maven.apache.org/maven-ci-friendly.html
Ed Randall

30

สิ่งนี้จะหลีกเลี่ยงความจำเป็นในการ grepping off บันทึกจากการส่งออก:

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

ในขณะที่รหัสนี้อาจตอบคำถามการให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการตอบคำถามจะปรับปรุงมูลค่าระยะยาวอย่างมีนัยสำคัญ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบาย
Toby Speight

1
ฉันคิดว่าวิธีนี้มีความจำเป็นต้องใส่ "-q" หลัง mvn
Rudge

ดีกว่าโซลูชันที่ยอมรับ ไม่จำเป็นต้องกรองเอาท์พุทที่มีเสียงดัง Maven
Willian Mitsuda

20

นี่เป็นคำตอบที่สะอาดที่สุดที่ฉันพบ:

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

ข้อดี:

  • สิ่งนี้ใช้ได้ดีกับทุกระบบปฏิบัติการและเชลล์ทั้งหมด
  • ไม่จำเป็นต้องใช้เครื่องมือภายนอกใด ๆ !
  • [สำคัญ] ใช้งานได้แม้ว่าเวอร์ชันโปรเจ็กต์จะสืบทอดจากพาเรนต์ pom.xml

บันทึก:

  • maven-help-pluginรุ่น3.2.0(และสูงกว่า) มีforceStdoutตัวเลือก คุณสามารถแทนที่3.2.0คำสั่งด้านบนด้วยเวอร์ชันที่ใหม่กว่าจากรายการรุ่นที่มีอยู่ของ mvn-help-pluginจากส่วนวัตถุถ้ามี
  • ตัวเลือก-qไม่แสดงข้อความแบบละเอียด ( [INFO]และ[WARN]อื่น ๆ )

หากคุณต้องการดึงข้อมูลgroupIdและartifactIdตรวจสอบคำตอบนี้


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 ขึ้นไปสิ่งนี้น่าจะใช้ได้ หากคุณมีรุ่นที่ต่ำกว่านั้นให้ติดตั้งpython-lxmlและเปลี่ยนการนำเข้าเป็น lxml.etree วิธีนี้รวดเร็วและไม่ต้องดาวน์โหลดปลั๊กอินเพิ่มเติม นอกจากนี้ยังใช้งานได้กับไฟล์ pom.xml ที่มีรูปแบบไม่ถูกต้องซึ่งไม่ได้ตรวจสอบกับ xmllint เช่นไฟล์ที่ฉันต้องการแยกวิเคราะห์ ทดสอบบน Mac และ Linux


12

ฉันยังคงพบกับกรณีข้างเคียงเมื่อใช้คำตอบอื่น ๆ ที่นี่ดังนั้นนี่เป็นอีกทางเลือกหนึ่ง

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

หากคุณไม่รังเกียจที่จะเขียนเวอร์ชันลงในไฟล์ชั่วคราวมีวิธีแก้ไขปัญหาอื่น (โดยไม่มี grep / sed) ที่ใช้งานได้ดีสำหรับฉัน ( แก้ไข : ดูคำตอบของ rjrjrสำหรับวิธีการแก้ปัญหาที่ง่ายกว่าโดยไม่ต้องยุ่งยากกับไฟล์ชั่วคราว)

ฉันใช้ปลั๊กอิน Exec Mavenพร้อมกับechoไบนารี ตรงกันข้ามกับ Maven Help Plugin ปลั๊กอิน Exec อนุญาตให้เปลี่ยนเส้นทางเอาต์พุตเป็นไฟล์ซึ่งสามารถใช้ในการข้าม grep / sed และทำให้สามารถแยกวิเคราะห์สิ่งแปลก ๆ เช่นสตริงรุ่นหลายบรรทัด (พร้อมบล็อก CDATA ในแท็กเวอร์ชัน) อย่างน้อยในระดับหนึ่ง

#!/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
นี่เป็นทางออกที่ดีกว่าปลั๊กอินตัวช่วยและคุณไม่ต้องการ i / o ทั้งหมด เพียงเพิ่มแฟล็ก -q และเอาต์พุตเท่านั้นจะเป็นเวอร์ชัน ดังนั้น: mvn -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' - ไม่ได้ org.codehaus.mojo-recursive - exec-maven-plugin: 1.3.1: exec
rjrjr

rjrjr: เยี่ยมมาก! สิ่งเดียวที่ฉันต้องพูดถึงคือการจัดการข้อผิดพลาด: หาก mvn ล้มเหลวคุณจะได้รับสายอักขระรุ่นที่ไม่ถูกต้อง ดังนั้นจึงจำเป็นต้องมีการตรวจสอบความถูกต้องบางอย่างเช่นการตรวจสอบโค้ดส่งคืน mvn หรือสตริงเอง
Tom

6

สำหรับบันทึกเป็นไปได้ที่จะกำหนดค่าการบันทึก SLF4J อย่างง่ายของ Maven โดยตรงในบรรทัดคำสั่งเพื่อส่งออกเฉพาะสิ่งที่เราต้องการโดยการกำหนดค่า:

  • org.slf4j.simpleLogger.defaultLogLevel=WARN และ
  • org.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO

เป็นเอกสารที่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

ด้วยเหตุนี้เราสามารถเรียกใช้อย่างง่ายดายtail -1และรับ:

$ 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

โปรดทราบว่านี่เป็นหนึ่งซับ MAVEN_OPTSกำลังถูกเขียนใหม่สำหรับmvnการดำเนินการเฉพาะนี้เท่านั้น


5

ฉันสังเกตเห็นว่ามีDownloaded:สายปลอมที่ออกมาในเอาต์พุตที่ทำลายการบ้านเดิมของฉัน นี่คือตัวกรองที่ฉันใช้ หวังว่ามันจะช่วย!

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

แก้ไข

ไม่แน่ใจ 100% ว่าทำไม แต่เมื่อทำงานนี้ผ่านการโพสต์สร้างสคริปต์ในเจนกิ้นส์เอาท์พุทออกมาเป็นเช่น[INFO]version[INFO]0.3.2

ฉันทิ้งผลลัพธ์ไปยังไฟล์และวิ่งผ่านตัวกรองแรกของฉันโดยตรงจาก BASH มันทำงานได้ดี .. ดังนั้นอีกครั้งไม่แน่ใจว่าเกิดอะไรขึ้นในดินแดนเจนกินส์

เพื่อให้ได้ 100% ในเจนกินส์ฉันได้เพิ่มsedตัวกรองติดตามผล นี่คือล่าสุดของฉัน

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

แก้ไข

หนึ่งบันทึกล่าสุดนี่ .. ผมพบว่าtrได้รับยังคงส่งผลให้ในสิ่งที่ต้องการ/r/n0.3.2(อีกครั้งเฉพาะเมื่อวิ่งผ่านเจนกินส์) เปลี่ยนเป็นawkและปัญหาได้หายไป! ผลงานสุดท้ายของฉัน

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

วิธีแก้ปัญหาอย่างง่าย ๆ เท่านั้น

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

และสำหรับคะแนนโบนัสแยกเป็นส่วนหนึ่งของรุ่น

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

ผมได้พัฒนาเมื่อเร็ว ๆ นี้Release Candidate Maven ปลั๊กอินที่แก้ปัญหาตรงนี้เพื่อให้คุณไม่ต้องรีสอร์ทเพื่อเชลล์สคริปต์ใด ๆ hacky maven-help-pluginและแยกการส่งออกของ

ตัวอย่างเช่นหากต้องการพิมพ์เวอร์ชันของโครงการ Maven ของคุณไปยังเทอร์มินัลให้รัน:

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

ซึ่งให้ผลลัพธ์คล้ายกับmaven-help-plugin:

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

อย่างไรก็ตามคุณยังสามารถระบุรูปแบบผลลัพธ์โดยพลการ (เพื่อให้สามารถเลือกรุ่นจากบันทึกโดยเซิร์ฟเวอร์ CI เช่นTeamCity ):

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

ซึ่งผลลัพธ์ใน:

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

ในการบันทึกผลลัพธ์ไปยังไฟล์ (เพื่อให้เซิร์ฟเวอร์ CI เช่นJenkinsสามารถใช้งานได้ ):

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

version.propertiesไฟล์ผลลัพธ์จะมีลักษณะดังนี้:

PROJECT_VERSION=1.0.0-SNAPSHOT

ด้านบนของทั้งหมดข้างต้นRelease Candidateยังให้คุณตั้งค่ารุ่นของโครงการของคุณ (ซึ่งเป็นสิ่งที่คุณอาจทำบนเซิร์ฟเวอร์ CI ของคุณ) ตามเวอร์ชัน API ที่คุณกำหนดไว้ใน POM ของคุณ

หากคุณต้องการที่จะเห็นตัวอย่างของผู้สมัครอิสระที่กำลังนำมาใช้เป็นส่วนหนึ่งของวงจรชีวิต Maven มีลักษณะที่เป็นpom.xmlของโครงการโอเพนซอร์สอื่น ๆ ของฉัน - จอภาพสำหรับรูปร่างเจนกินส์


5

นอกจากนี้ยังมีตัวเลือกหนึ่งโดยไม่จำเป็นต้องใช้ Maven:

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

อันนี้แสดงเฉพาะเหตุการณ์แรกใน pom ในกรณีของฉันเกิดขึ้นครั้งแรกให้ผู้ปกครองรุ่นปอม แต่ความจริงแล้วนี่คือคำตอบที่ฉันต้องการ เร็วกว่าโซลูชันที่กล่าวถึงก่อนหน้านี้และสามารถแก้ไขได้ง่ายเพื่อให้เกิดเหตุการณ์ที่เหมาะสม เพื่อรับการใช้งานครั้งที่สอง: grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pเพื่อรับการใช้งานครั้งที่สาม: grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pและอื่น ๆ
Krzysztof Cieśliński

คุณกำลังสมมติว่าองค์ประกอบเวอร์ชันเป็นเหตุการณ์แรกและจะไม่ทำงานเมื่อสมมติฐานไม่ถูกต้อง
devildelta

3

โซลูชัน all-in-one ที่เข้าใจได้ง่ายที่ให้ผลลัพธ์เวอร์ชัน maven project และไม่แสดงเอาต์พุตภายนอก[INFO]และDownloadข้อความ:

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

สิ่งเดียวกัน แต่แยกออกเป็นสองบรรทัด:

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

ขาออก: 4.3-SNAPSHOT

ดังนั้นใช้ของคุณproject.versionในสคริปต์ทุบตีง่าย ๆ :

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

โซลูชันอื่น ๆ ในหน้านี้ดูเหมือนจะไม่รวมเทคนิคทั้งหมดไว้ในที่เดียว


3

ควรจะง่ายเนื่องจากข้อผิดพลาดนี้ได้รับการแก้ไขใน Maven ช่วยเหลือปลั๊กอิน 3.0.0: MPH-99 มีการประเมินการส่งออกในโหมดเงียบไม่มี


Sadly 3.0.0 ไม่เผยแพร่
Víctor Romero

3

นี่คือวิธีการแก้ปัญหาการทุบตีและวางที่ง่ายที่สุด:

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

มันก้อง

1.4

2

ฉันพบความสมดุลที่เหมาะสมสำหรับฉัน หลังจากmvn packageปลั๊กอิน maven-archiver สร้างtarget/maven-archiver/pom.propertiesด้วยเนื้อหาเช่นนี้

version=0.0.1-SNAPSHOT
groupId=somegroup
artifactId=someArtifact

และฉันใช้ทุบตีเพียงเพื่อรัน

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

แล้วก็

echo $version
0.0.1-SNAPSHOT

แน่นอนว่ามันไม่ปลอดภัยเลยสำหรับการเรียกใช้ไฟล์นี้ แต่การดำเนินการสามารถแปลงเป็น Perl หรือ bash script ได้อย่างง่ายดายเพื่ออ่านและตั้งค่าตัวแปรสภาพแวดล้อมจากไฟล์นั้น


1

สิ่งนี้ใช้ได้สำหรับฉันออฟไลน์และไม่ขึ้นอยู่กับ mvn:

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

1

Exec plugin ทำงานโดยไม่มีการแยกวิเคราะห์เอาต์พุตใด ๆ เนื่องจากเอาต์พุตสามารถถูกเปลี่ยนเส้นทางไปยังไฟล์และฉีดกลับเข้าไปในสภาพแวดล้อมของงานผ่านปลั๊กอิน EnvInject:

ป้อนคำอธิบายรูปภาพที่นี่


1

ตามคำถามฉันใช้สคริปต์ด้านล่างนี้เพื่อเพิ่มหมายเลขรุ่นของฉันโดยอัตโนมัติใน 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

ทั้งที่คุณมีmvnให้คำตอบ (เป็นคำตอบส่วนใหญ่แนะนำ) pom.xmlหรือคุณดึงคำตอบจาก ข้อเสียเปรียบเพียงประการเดียวของวิธีที่สองคือคุณสามารถดึงค่าของ<version/>แท็กได้อย่างง่ายดายแต่จะมีความหมายเฉพาะถ้าเป็นตัวอักษรนั่นคือไม่ใช่คุณสมบัติ Maven ฉันเลือกวิธีการนี้อยู่แล้วเพราะ:

  • mvn เป็นวิธีการ verbose และฉันไม่ชอบกรองผลลัพธ์
  • เริ่มต้นเมื่อเทียบช้ามากที่จะอ่านmvnpom.xml
  • <version/>ฉันมักจะใช้ค่าที่แท้จริงใน

mvn-versionเป็นzshเชลล์สคริปต์ที่ใช้xmlstarletในการอ่านpom.xmlและพิมพ์เวอร์ชันของโครงการ (ถ้ามีอยู่) หรือเวอร์ชันของโปรเจ็กต์หลัก (ถ้ามี):

$ mvn-version .
1.0.0-SNAPSHOT

ข้อดีก็คือว่ามันเป็นวิธีที่เร็วกว่าการทำงาน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

ความแตกต่างในเครื่องของฉันมีขนาดใหญ่กว่าสองออเดอร์


0

ฉันต้องการสิ่งนี้ในระหว่างงานเทรวิส แต่มีหลายค่า ฉันเริ่มต้นด้วยวิธีนี้แต่เมื่อโทรหลายครั้งมันช้ามาก (ฉันต้องการ 5 การแสดงออก)

ฉันเขียนปลั๊กอิน maven ง่ายๆเพื่อแยกค่าของ pom.xml ลงในไฟล์. 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

จะผลิตที่:

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

ตอนนี้คุณสามารถเพียงแค่แหล่งไฟล์

source .target/ci-tools-env.sh

มีความสุข.


-1

ฉันกำลังใช้หนึ่งซับในเชลล์ยูนิกซ์ของฉัน ...

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

คุณสามารถซ่อนบรรทัดนี้ในเชลล์สคริปต์หรือเป็นนามแฝง


-1

นี่คือการแก้ไขจากด้านบน

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

ฉันทดสอบมันบน cmdline ทำงานได้ดี

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

เป็นอีกเวอร์ชั่นเดียวกัน ฉันจำเป็นต้องได้รับหมายเลขรุ่นใน Jenkins CI ใน k8s โดยไม่ติดตั้ง mvn ดังนั้นนี่จึงเป็นประโยชน์มากที่สุด

ขอบคุณทุกคน


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

ฉันเพิ่งเพิ่มsedการปรับปรุงตัวกรองขนาดเล็กที่ฉันเพิ่งนำมาใช้เพื่อแยกproject.versionจากผลลัพธ์ maven


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

นี่คือสิ่งที่ฉันเคยได้รับหมายเลขรุ่นคิดว่าจะมีวิธีที่ดีกว่าที่จะทำเช่นนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.