बैश कमांड लाइन को मावेन परियोजना संस्करण कैसे प्राप्त करें


201

पिछली बार मैंने एक सवाल जारी किया था कि कमांड लाइन से मैवेन प्रोजेक्ट वेशन को कैसे बदला जाए जो मुझे एक नए मुद्दे की ओर ले जाए।

पहले मैं संस्करण संख्या प्राप्त करने में सक्षम था क्योंकि संस्करण को एक संपत्ति के रूप में संग्रहीत किया गया था जो कमांड लाइन (बैश) से जीआरईपी और पार्स करना आसान था। अब चूंकि pom.xml तत्व का उपयोग इसके लिए किया जाता है, इसलिए यह सभी निर्भरताओं के बाद से अद्वितीय नहीं है और शायद कुछ अन्य भी इसका उपयोग करते हैं। मुझे लगता है कि एक्सएमएल या कुछ बहुत ही संदर्भ-जागरूक सेड कमांड को पार्स करने के लिए बाहरी टूल के बिना बैश स्क्रिप्ट के साथ वर्तमान संस्करण संख्या प्राप्त करने का कोई तरीका नहीं है ।

मेरे संस्करण में सबसे साफ समाधान मावेन के लिए इस संस्करण की जानकारी को सौंपने के लिए होगा। मैं विभिन्न गुणों को पुनः प्राप्त करने के लिए एक कस्टम मावेन प्लगइन लिखने के बारे में सोच रहा था, लेकिन मुझे लगा कि मैं यहां पहले पूछूंगा।

तो, क्या ${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 } }'`

जो मुझे वर्तमान संस्करण देता है जिसे मैं तब आगे बढ़ा सकता हूं। ग्रीपिंग सरल हो सकता है, लेकिन मुझे लगा कि मैं जितना संभव हो उतना मजबूत होना चाहता हूं, इसलिए मैं पहली पंक्ति से संतुष्ट हूं जो एक नंबर से शुरू होती है और इसे संस्करण संख्या के रूप में संभालने की कोशिश करती है।

# 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
समाधान सेड की अभिव्यक्ति को समाप्त करने के लिए एक 'याद आती है।
नवरात्र

कौन सी सेड ऍक्स्प? मैं नोटिस नहीं कर सकता।
mkko

1
तेजी से निष्पादन के लिए एक मवन -ओ बनाओ
नाथन बुबना 22

2
आप उस जटिल grep -e '^[[:digit:]]'
सेड

2
यदि आप @NathanBubna द्वारा अनुशंसित के रूप में -o का उपयोग करते हैं तो वह 'ऑफ़लाइन' मोड में मावेन डाल देगा। यदि आपके पास पहले से मावेन सहायता प्लगइन नहीं है और आश्रित जार डाउनलोड है, तो बिल्ड विफल हो जाएगा। एक बिट के लिए उस से जला दिया, आशा है कि यह किसी और की मदद करता है।
22

जवाबों:


217

Maven सहायता प्लगइन किसी भी तरह पहले से ही इस के लिए कुछ प्रस्ताव है:

  • help:evaluate एक इंटरैक्टिव मोड में उपयोगकर्ता द्वारा दिए गए मावेन अभिव्यक्तियों का मूल्यांकन करता है।

यहाँ है कि आप इसे कमांड लाइन पर कैसे प्राप्त करेंगे ${project.version}:

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

8
ठीक है शुक्रिया। मुझे लगता है कि यह एक करीबी समाधान है। किसी भी विचार मैं कैसे maven उत्पादन surpress और उन [INFO]संदेशों को बाहर फ़िल्टर कर सकते हैं ? मुझे मावेन के लिए एक स्विच नहीं मिला। अन्यथा मैं संस्करण संख्या को पार्स करने के लिए सिर्फ कुछ कमांड लाइन स्क्रिप्टिंग जोड़ूंगा।
mkko

80
मैं सभी लॉगिंग (INFO, WARNING, आदि) और 'डाउनलोड' संदेशों के साथ निकाल रहा हूंmvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick

13
मावेन से कुछ कम क्रिया की उम्मीद नहीं की जाएगी
एंडी

24
यहाँ एक दृष्टिकोण है मैं एहसान करता हूँ:printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
राख

40
@montoyaed ने सबसे अच्छा जवाब पोस्ट किया जो बस है mvn help:evaluate -Dexpression=project.version -q -DforceStdout। बैश उपयोग में एक चर में इसे पकड़ने के लिएversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
सेबस्टियन थॉमसन

200

Exec Maven Plugin के साथ टॉम का समाधान बहुत बेहतर है, लेकिन फिर भी इससे अधिक जटिल होना आवश्यक है। मेरे लिए यह उतना ही सरल है:

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

30
मुझे लगता है कि यह सबसे आसान तरीका है क्योंकि यह grep या इसी तरह की चीजों का उपयोग नहीं करता है। ध्यान दें: आप इसे थोड़ा छोटा कर सकते हैं:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
स्क्रूटरी

1
यह समाधान मेरे लिए अच्छी तरह से काम के रूप में मैं ग्रुप, artifactId और संस्करण मुद्रित करने के लिए करना चाहता था .. -Dexec.args='${project.groupId}:${project.artifactId}:${project.version}'
जेम्स एच।

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 कमांड या समान लागू करने की आवश्यकता नहीं है
7:76

क्या हैset -o errexit
Theonlygusti

80

मैं कुछ शोध कर रहा हूं और निम्नलिखित पाया:

  1. मावेन को दोषी ठहराया गया है क्योंकि DevOps उपकरणों के साथ एकीकरण इस तथ्य के कारण आसान नहीं है कि यह CLS उपकरण के संबंध में कुछ अच्छी प्रथाओं का पालन नहीं करता है। (संदर्भ: https://youtu.be/1ilew6Qca3U?t=372 )

  2. पिछले दावे पर प्रेरित, मैंने मावेन के स्रोत कोड के साथ-साथ मावेन-हेल्प-प्लगइन पर एक नज़र डालने का फैसला किया। ऐसा लगता है कि उन्होंने मावेन-एस स्विच को थोड़ा ठीक कर दिया है (मैं संस्करण 3.5.3 का उपयोग कर रहा हूं), इसलिए अब यदि आप इसे पास करते हैं, तो आपको सभी कष्टप्रद गैर-समझ वाले सामान नहीं मिलेंगे जो मावेन का उपयोग करने से रोकता है। स्वचालित स्क्रिप्ट के भीतर। तो आप इस तरह से कुछ का उपयोग करने में सक्षम होना चाहिए:

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

    समस्या यह है कि यह कमांड कुछ भी प्रिंट नहीं करता है क्योंकि डिफ़ॉल्ट रूप से मदद प्लगइन उस लकड़हारे के माध्यम से आउटपुट करता है जिसे -q स्विच द्वारा चुप करा दिया गया है। (प्लगइन का नवीनतम उपलब्ध संस्करण जून, 3 जी 2018 पर 3.1.0 जारी किया गया है)

  3. कार्ल हेंज मार्बाइस ( https://github.com/khmarbaise ) ने इसे एक वैकल्पिक पैरामीटर जोड़कर तय किया जो आपको निम्नलिखित तरीके से इसे कॉल करने की अनुमति देता है:

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

    प्रतिबद्ध विवरण यहां उपलब्ध है: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )


2
यह मेरा पसंदीदा समाधान होगा और आधिकारिक सहायता पृष्ठों पर भी इसका उल्लेख किया गया है । हालाँकि, यह मेरे लिए काम नहीं करता है। मैं मैवेन v3.5.3 के साथ MacOS पर हूं। जब मैं -qस्विच का उपयोग नहीं करता तो यह संस्करण को सही तरीके से प्रिंट करता है (लॉग लाइनों के बीच)। कोई विचार?
गुस्क

3
यह स्वीकृत उत्तर होना चाहिए। यह विंडोज और लिनक्स में काम करता है (मैंने मैक्स ओएसएक्स की कोशिश नहीं की), और यह सरल है। धन्यवाद।
trash80

1
@montoyaedu जवाब न देने के लिए क्षमा करें। इस बीच मैंने 3.5.4 maven को अपडेट किया है जो -qस्विच के साथ ठीक काम करता है ।
8

1
@gucce मैं पुष्टि कर सकता हूं कि उपयोग किए गए मावेन संस्करण इसको प्रभावित करता है: 3.5.2 (डेबियन 9 पर पैकेज संस्करण) के साथ आउटपुट -q -DforceStdoutखाली था, यहां तक ​​कि प्लगइन का संस्करण 3.1.0 भी सुनिश्चित किया गया था प्लगइन के साथ उपयोग किया गया था); मैंने
मावेन के

3
अंत में, 2019 के लिए grep के बिना एक व्यावहारिक समाधान - (यह स्वीकृत उत्तर बनना चाहिए)। सीआई के अनुकूल संस्करणों के साथ भी काम करता है - 3.3.9, 3.5.3, 3.5.4, 3.6.0 पर परीक्षण किया गया
एड रान्डेल

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

2
उस मवन को और तेज़ बनाने के लिए
नाथन बुबना

1
नीचे मेरा उत्तर (क्विकशिफ्टिन) देखें जो 'डाउनलोड किया गया:' लाइनों को भी फ़िल्टर करता है।
क्विकशिफ्टिन

10
यदि आप @NathanBubna द्वारा अनुशंसित के रूप में -o का उपयोग करते हैं तो वह 'ऑफ़लाइन' मोड में मावेन डाल देगा। यदि आपके पास पहले से मावेन सहायता प्लगइन नहीं है और आश्रित जार डाउनलोड है, तो बिल्ड विफल हो जाएगा। एक बिट के लिए उस से जला दिया, आशा है कि यह किसी और की मदद करता है।
फिलिप्पुविवर्स 22

आप यह भी जोड़ना चाह सकते हैं 2> /dev/nullअन्यथा आप प्राप्त कर सकते हैंPicked up _JAVA_OPTIONS:
Jakub Bochenski

2
विंडोज पर, कमांड के अंत को बदलें | findstr /v "["
तुनकी

39

मेरी राय में शीर्ष उत्तर बहुत कचरा है, आपको मावेन कंसोल आउटपुट को हैक करने के लिए जीआरपी के एक गुच्छा का उपयोग करना होगा। नौकरी के लिए सही उपकरण का उपयोग क्यों न करें? संस्करण संख्या को प्राप्त करने के लिए xpath सिंटैक्स का उपयोग करना सबसे अच्छा तरीका है, क्योंकि यह एक्सएमएल डेटा संरचना तक पहुंचने का इच्छित तरीका है। नीचे दिए गए अभिव्यक्ति तत्वों के "स्थानीय नाम" का उपयोग करके पोम को ट्रेस कर रहे हैं, दूसरे शब्दों में नामस्थान घोषणाओं की अनदेखी करते हैं जो xml में मौजूद हो सकते हैं या नहीं।

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

@bobmarksie I दूसरा कि; रेवक्सप के साथ मावेन का उपयोग करना और आउटपुट को स्क्रब करना दर्दनाक है।
मवेलपंड

3
उस परियोजना के बारे में क्या जो एक मूल पोम से विरासत में मिली है।
वेस

2
"नौकरी के लिए सही उपकरण का उपयोग क्यों नहीं किया?" आईई!
jeremyjjbrown

मैं समझता हूं कि mvnसही दृष्टिकोण और execप्लगइन वास्तव में अच्छी तरह से काम करता है, लेकिन सभी mvn समाधानों को हल करना पड़ता है और मैं एक बिल्ड पाइपलाइन को बूटस्ट्रैप करने की कोशिश कर रहा हूं जहां निर्भरता समाधान काम नहीं करेगा, इसलिए मैं execइस समाधान के साथ दृष्टिकोण को बदलने जा रहा हूं । सौभाग्य से, मुझे माता-पिता से विरासत में मिले संस्करणों के बारे में चिंता करने की ज़रूरत नहीं है।
हरसदेव

यह ci-friendly version के साथ काम नहीं करेगा, जहाँ संस्करण ${revision}उदाहरण के लिए एक संपत्ति है । संदर्भ। maven.apache.org/maven-ci-friendly.html
एड रैंडल

30

यह आउटपुट से लॉग प्रविष्टियों को बंद करने की आवश्यकता से बचाएगा:

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

हालांकि यह कोड इस सवाल का जवाब दे सकता है कि क्यों और / या कैसे का जवाब देने के संबंध में अतिरिक्त संदर्भ प्रदान करने से इसकी लंबी अवधि के मूल्य में काफी सुधार होगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें।
टोबी स्पाइट

1
मुझे लगता है कि इस दृष्टिकोण के लिए मवन के बाद "-q" डालना आवश्यक है।
रुड

यह स्वीकृत समाधान से बेहतर है; शोर शोर आउटपुट को फ़िल्टर करने की कोई आवश्यकता नहीं है।
विलियन मित्सुडा

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विकल्प है। आप mvn-help-plugin3.2.0 के उपलब्ध संस्करणों की सूची से एक नए संस्करण के साथ उपरोक्त कमांड में बदल सकते हैंयदि उपलब्ध हो तो आप आर्टिफैक्ट से ।
  • विकल्प -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)"

जब तक आपके पास अजगर 2.5 या अधिक है, तब तक यह काम करना चाहिए। यदि आपके पास इससे कम संस्करण है, python-lxmlतो आयात को lxml.etree पर स्थापित करें और बदलें। यह विधि त्वरित है और किसी भी अतिरिक्त प्लगइन्स को डाउनलोड करने की आवश्यकता नहीं है। यह विकृत pom.xml फ़ाइलों पर भी काम करता है जो xmllint के साथ मान्य नहीं हैं, जैसे कि मुझे पार्स करने की आवश्यकता है। मैक और लिनक्स पर परीक्षण किया गया।


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
यंगीन

7

यदि आप संस्करण को एक अस्थायी फ़ाइल में लिखने का मन नहीं बनाते हैं, तो एक और समाधान है (बिना grep / sed) जो मेरे लिए अच्छा काम करता है। ( संपादित करें : बिना किसी अस्थायी फ़ाइल झंझट के बहुत सरल समाधान के लिए rjrjr का उत्तर देखें )

मैं बाइनरी के साथ Exec Maven Plugin का उपयोग करता हूं echo। मावेन हेल्प प्लगिन के विपरीत, एक्ज़ प्लगिन एक फ़ाइल में आउटपुट पुनर्निर्देशन की अनुमति देता है, जिसका उपयोग grep / sed को बायपास करने के लिए किया जा सकता है, और मल्टीलाइन वर्जन स्ट्रिंग्स (सीडीए ब्लॉक इन वर्जन टैग के साथ) जैसी अजीब चीजों को पार्स करना भी संभव बनाता है। कम से कम एक हद तक।

#!/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 ध्वज जोड़ें और केवल आउटपुट संस्करण होगा। अतः: mvan -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' - तोप-पुनरावर्ती org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec
rjrjr

rjrjr: बहुत बढ़िया! केवल एक चीज जिसका मुझे यहां उल्लेख करने की आवश्यकता है वह है त्रुटि से निपटने: यदि mvn विफल रहता है, तो आपको एक अमान्य संस्करण स्ट्रिंग मिलता है। तो कुछ सत्यापन की आवश्यकता होती है, जैसे mvn रिटर्न कोड या स्ट्रिंग की जाँच करना।
टॉम

6

केवल रिकॉर्ड के लिए, मावेन के सरल एसएलएफ 4 जे को सीधे कमांड लाइन में लॉग इन करना संभव है, केवल आउटपुट के लिए जो हमें कॉन्फ़िगर करके आवश्यक है:

  • 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

मैंने हाल ही में रिलीज़ कैंडिडेट मावेन प्लगइन विकसित किया है जो इस सटीक समस्या को हल करता है ताकि आपको किसी भी हैली शेल स्क्रिप्ट का सहारा न लेना पड़े और आउटपुट को पार्स करना पड़ेmaven-help-plugin

उदाहरण के लिए, अपने मावेन प्रोजेक्ट के संस्करण को टर्मिनल पर प्रिंट करने के लिए, चलाएं:

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

हालांकि, अगर आप भी एक निर्दिष्ट कर सकते हैं मनमाने ढंग से उत्पादन प्रारूप (ताकि संस्करण के रूप में एक सीआई सर्वर द्वारा लॉग से उठाया जा सकता है 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] ------------------------------------------------------------------------

फ़ाइल में आउटपुट को बचाने के लिए (ताकि जेन सर्वर जैसे कि जेनकींस इसका इस्तेमाल कर सके ):

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

उपरोक्त सभी के ऊपर, रिलीज़ कैंडिडेट आपको संस्करण सेट करने की भी अनुमति देता है आपको अपने POM में परिभाषित एपीआई संस्करण के आधार पर आपको अपने प्रोजेक्ट (जो कि आप शायद अपने CI सर्वर पर करना चाहते हैं) ।

यदि आप मावेन जीवन चक्र के हिस्से के रूप में उपयोग किए जा रहे रिलीज़ कैंडिडेट का उदाहरण देखना चाहते हैं, तो pom.xmlमेरे अन्य ओपन-सोर्स प्रोजेक्ट - बिल्ड मॉनिटर फॉर जेनकिन्स पर एक नज़र डालें ।


5

मावेन की आवश्यकता के बिना एक विकल्प भी है:

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

यह एक पोम में केवल पहली घटना को दर्शाता है। मेरे मामले में पहली घटना पैरेंट पोम संस्करण देती है। लेकिन सच कहूं तो यह वह जवाब है जिसकी मुझे तलाश थी। पहले बताए गए समाधानों की तुलना में यह बहुत तेज़ है और उचित घटना प्राप्त करने के लिए इसे संशोधित करना आसान है। दूसरी घटना का उपयोग grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pकरने के लिए: तीसरी घटना का उपयोग करने के लिए: grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pऔर इसी तरह
क्रिज़ीस्तोफ़ सियालीस्की

आप मान रहे हैं कि संस्करण तत्व पहली घटना है, और यह तब काम नहीं करता है जब धारणा अमान्य है।
देविल्लता

3

सभी में एक समाधान को समझने में आसान है जो मावेन प्रोजेक्ट संस्करण को आउटपुट करता है, [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

यह आसान होना चाहिए क्योंकि यह बग मावेन-हेल्प-प्लगइन 3.0.0 में तय किया गया है: एमपीएच -99 मूल्यांकन में शांत मोड में कोई आउटपुट नहीं है


अफसोस की बात है 3.0.0 प्रकाशित नहीं हुआ है
विक्टर रोमेरो

3

यह अब तक का सबसे आसान बैश कट और पेस्ट समाधान है:

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

यह गूँजता है

1.4

2

मुझे मेरे लिए सही संतुलन मिला। mvn packageमावेन-अभिलेखीय प्लगइन के बाद 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

बेशक यह इस फ़ाइल को निष्पादित करने के लिए बिल्कुल भी सुरक्षित नहीं है, लेकिन निष्पादन को आसानी से उस फ़ाइल से पर्यावरण चर को पढ़ने और सेट करने के लिए पर्ल या बैश स्क्रिप्ट में परिवर्तित किया जा सकता है।


1

यह मेरे लिए, ऑफ़लाइन और बिना मवन पर निर्भर किए काम करता है:

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

1

Exec plugin बिना किसी आउटपुट पार्सिंग के काम करता है क्योंकि आउटपुट को फ़ाइल में रीडायरेक्ट किया जा सकता है और Envject इंजेक्शन के माध्यम से नौकरी के माहौल में वापस इंजेक्ट किया जाता है:

यहां छवि विवरण दर्ज करें


1

इस प्रश्न के आधार पर, मैं नीचे दिए गए सभी स्क्रिप्ट माता-पिता / सबमॉडल्स में अपने संस्करण संख्या को स्वचालित रूप से बढ़ाने के लिए इस स्क्रिप्ट का उपयोग करता हूं:

#!/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/>टैग के मूल्य को निकाल सकते हैं , लेकिन यह केवल तभी सार्थक होगा जब यह शाब्दिक हो , यानी मावेन संपत्ति नहीं। मैंने वैसे भी इस दृष्टिकोण को चुना क्योंकि:

  • mvn वर्बोज़ करने का तरीका है और मुझे इसका आउटपुट फ़िल्टर करना पसंद नहीं है।
  • शुरू mvnपढ़ने की तुलना में बहुत धीमी है pom.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 एक्सप्रेशन की आवश्यकता होती है)।

मैंने .sh फ़ाइल में pom.xml के मान निकालने के लिए एक सरल मावेन प्लगइन लिखा था।

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

मैं अपने यूनिक्स शेल में एक-लाइनर का उपयोग कर रहा हूं ...

बिल्ली pom.xml | grep "" | सिर-एन १ | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g"

आप इस लाइन को शेल स्क्रिप्ट में या अन्य उपनाम के रूप में छिपा सकते हैं।


-1

यह ऊपर से एक संपादन है

बिल्ली pom.xml | grep "" | सिर-एन १ | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g"

मैं इसे अच्छी तरह से cmdline काम करता है पर बाहर का परीक्षण किया

grep "" pom.xml | सिर-एन १ | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g"

उसी का एक और संस्करण है। मुझे k8s में जेनकिंस CI में संस्करण संख्या प्राप्त करने की आवश्यकता है, बिना mvan स्थापित किए इसलिए यह सबसे अधिक उपयोगी है

सबको शुक्रीया।


-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मावेन आउटपुट से निकालने के लिए लागू किया है ।


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

यह वही है जो मैंने संस्करण संख्या प्राप्त करने के लिए इस्तेमाल किया, सोचा कि ऐसा करने के लिए एक बेहतर मावेन तरीका होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.