Mavenプロジェクトバージョンをbashコマンドラインに取得する方法


201

以前、Mavenプロジェクトのバージョンをコマンドラインから変更して新しい問題を引き起こす方法について質問しました。

以前は、バージョンがコマンドライン(bash)から簡単にgrepして解析できるプロパティとして保存されていたため、バージョン番号を取得できました。これでpom.xml要素が使用されるようになりましたが、すべての依存関係とおそらく他の依存関係もこれを使用しているため、一意ではなくなりました。xmlを解析するための外部ツールまたは非常にコンテキストに対応したsedコマンドがないと、bashスクリプトで現在のバージョン番号を取得する方法はないと思います。

私の意見で最もクリーンなソリューションは、Mavenがこのバージョン情報を配布することです。さまざまなプロパティを取得するためのカスタムmavenプラグインを作成することを考えていましたが、最初にここで質問したいと思いました。

それで、${project.version}コマンドラインに値を取得する簡単な方法はありますか?前もって感謝します。

解決

お手伝いありがとう。私はcd手動でディレクトリに行かなければなりませんでしたが、それは簡単に行うことができます。私のbashスクリプトには

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

どのsed expですか?気付かないようです。
mkko 11/10/14

1
実行を高速化するためにmvn -oを作成
Nathan Bubna '30

2
その複雑なsed式を単純な式に置き換えることができますgrep -e '^[[:digit:]]'
bpedman

2
@NathanBubnaが推奨する-oを使用すると、Mavenが「オフライン」モードになります。Mavenヘルププラグインと依存jarをまだダウンロードしていない場合、ビルドは失敗します。少し焦ってしまいました。他の人の役に立つことを願っています。
phillipuniverse 2014

回答:


217

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など)および「ダウンロード」メッセージを削除しますmvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick

13
は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。バッシュの使用中の変数でそれをキャプチャするversion=$(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などの使用を意味するものではないため、最も簡単な方法だと思います。クイックノート:少し短くすることができます:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
scrutari

1
groupId、artifactId、およびversion ..を出力したかったので、このソリューションはうまく機能しました-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 肩をすくめて、私にはうまくいかないもう1つの答え、まあ
cbmanica 2017年

それが壊れてはgrep / sedのコマンドまたは類似適用する必要がないので、これは、私がこれまで見た中で最高のソリューションですありがとう
Mike76

とはset -o errexit
theonlygusti

80

私はいくつかの研究をしていて、次のことがわかりました:

  1. Mavenは、DevOpsツールとの統合がCLIツールに関するいくつかの優れたプラクティスに従っていないために容易ではないため、非難されています。(参照:https : //youtu.be/1ILEw6Qca3U?t=372

  2. 以前のアサーションに触発されて、私はmavenのソースコードとmaven-help-pluginを確認することにしました。彼らはmavenの-qスイッチを少し修正したようです(私はバージョン3.5.3を使用しています)ので、これを渡すと、mavenの使用を妨げる迷惑な意味のないロギングのすべてが得られなくなります自動化スクリプト内。したがって、次のようなものを使用できるはずです。

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

    問題は、このコマンドは何も出力しないことです。デフォルトでは、ヘルププラグインは-qスイッチによってサイレントにされたロガーを介して出力するためです。(プラグインの利用可能な最新バージョンは2018年6月3日にリリースされた3.1.0です)

  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
これは私の推奨ソリューションであり、公式ヘルプページにも記載されています。しかし、私にはうまくいきません。Maven v3.5.3を搭載したMacOSを使用しています。-qスイッチを使用しない場合、バージョンが正しく出力されます(ログ行の間)。何か案は?
gucce

3
これは受け入れられる答えになるはずです。これはWindowsとLinuxで動作し(Max OSXは試していません)、シンプルです。ありがとうございました。
trash80 2018

1
@montoyaedu返事がないのでごめんなさい。それまでの間、-qスイッチで問題なく動作するmaven 3.5.4に更新しました。
gucce 2018年

1
@gucce使用されているmavenバージョンがこれに影響することを確認でき-q -DforceStdoutます。私はmavenのバージョン3.5.4でmavenラッパーを構成し、それは正しく機能しました
Gorkk

3
最後に、2019のgrepを使用しない実用的なソリューション-(これは受け入れられる答えになるはずです)。連携CI-優しいバージョンあまりにも- 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
実行を高速化するためにmvn -oを作成
Nathan Bubna '30

1
以下の「ダウンロード済み」行をフィルタリングする私の回答(quickshiftin)を参照してください。
quickshiftin 2013年

10
@NathanBubnaが推奨する-oを使用すると、Mavenが「オフライン」モードになります。Mavenヘルププラグインと依存jarをまだダウンロードしていない場合、ビルドは失敗します。少し焦ってしまいました。他の人の役に立つことを願っています。
phillipuniverse 2014

2> /dev/null他の方法で入手できるように追加することもできますPicked up _JAVA_OPTIONS:
Jakub Bochenski

2
Windowsでは、コマンドの最後をに置き換え| findstr /v "["ます。
Tunaki

39

トップの答えは私の意見ではかなりごみです。Mavenコンソールの出力をハックアウトするには、grepの束を使用する必要があります。仕事に適したツールを使用してみませんか?xpath構文は、XMLデータ構造にアクセスするための意図された方法であるため、バージョン番号を取得するための最良のアプローチです。以下の式は、要素の「ローカル名」を使用してpomをトラバースしています。つまり、xmlに存在する場合と存在しない場合がある名前空間宣言を無視しています。

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

@bobmarksie 2番目に。mavenを使用して、正規表現で出力をスクラブするのは大変です。
mhvelplund

3
親pomから継承するプロジェクトはどうでしょうか。
ウェス

2
「仕事に適したツールを使用しないのはなぜですか?」IE!Maven?
jeremyjjbrown

使用mvnは正しいアプローチであり、execプラグインは実際にはうまく機能することを理解していますが、すべてのmvnソリューションは解決する必要があり、依存関係の解決が機能しないビルドパイプラインをブートストラップしようとしているのでexec、このソリューションでアプローチを置き換えます。幸いなことに、私は親から継承されたバージョンについて心配する必要はありません。
haridsv

これは${revision}、たとえばバージョンがプロパティのようなciフレンドリーなバージョン管理では機能しません。参照 maven.apache.org/maven-ci-friendly.html
Ed Randall

30

これにより、ログエントリを出力からgrepする必要がなくなります。

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

このコードは質問に答えるかもしれませんが、なぜまたはどのように質問に答えるに関する追加のコンテキストを提供すると、長期的な価値が大幅に向上します。回答を編集して説明を追加してください。
Toby Speight

1
このアプローチでは、mvnの後に「-q」を付ける必要があると思います。
2017

これは、受け入れられているソリューションよりも優れています。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に変更します。この方法は迅速で、追加のプラグインをダウンロードする必要はありません。また、解析する必要があるファイルのように、xmllintで検証されない不正な形式のpom.xmlファイルでも機能します。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 2016年

7

バージョンを一時ファイルに書き込むことを気にしない場合は、(grep / sedを使用しない)私にとってうまく機能する別の解決策があります。(編集:一時的なファイルの手間なしにはるかに簡単な解決策についてはrjrjrの答えを参照してください)

バイナリと一緒にExec Mavenプラグインを使用しますecho。Mavenヘルププラグインとは対照的に、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
これはヘルパープラグインよりもはるかに優れたソリューションであり、そのすべての入出力は必要ありません。-qフラグを追加するだけで、出力がバージョンになります。したがって:mvn -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec
rjrjr

rjrjr:すばらしい!ここで言及する必要があるのは、エラー処理だけです。mvnが失敗すると、無効なバージョン文字列が返されます。したがって、mvnの戻りコードや文字列自体をチェックするなど、いくつかの検証が必要です。
トム

6

参考までに、MavenのSimple SLF4Jロギングをコマンドラインで直接構成して、必要なものだけを出力するように構成することが可能です。

  • 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%わかりませんが、Jenkinsのビルド後スクリプトでこれを実行すると、出力はとして出力されていました[INFO]version[INFO]0.3.2

出力をファイルにダンプし、最初のフィルターをBASHから直接実行しましたが、正常に動作します。したがって、Jenkinsランドで何が行われているのかがわかりません。

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

編集

ここで最後に1つ注意します。私trまだ/r/n0.3.2(Jenkins経由で実行している場合にのみ)などの結果をもたらしていることがわかりました。に切り替え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

単純なmavenのみのソリューション

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プラグインを開発しました。そのため、ハッキーなシェルスクリプトに頼ったり、出力を解析したりする必要はありません。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] ------------------------------------------------------------------------

ただし、任意の出力形式を指定することもできます(これにより、TeamCityなどのCIサーバーがログからバージョンを取得できるようになります)。

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

出力をファイルに保存するには(JenkinsなどのCIサーバーが使用できるようにするため):

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では、POMで定義したAPIバージョンに基づいて、プロジェクトのバージョン(CIサーバーでおそらく行うことになるもの)を設定することもできます。

Mavenライフサイクルの一部として使用されているリリース候補の例を確認したい場合pom.xmlは、他のオープンソースプロジェクトであるJenkins用のビルドモニターを参照してください


5

Mavenを必要としないオプションも1つあります。

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

これは、pomの最初の発生のみを示しています。私の場合、最初の出現は親pomバージョンを与えます。しかし正直なところ、これが私が探していた答えです。これは、前述の解決策よりもはるかに高速で、適切な発生を得るために簡単に変更できます。2回目の出現の使用を得るために:grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p第三出現利用を得るために:grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pというように
クシシュトフCieśliński

バージョン要素が最初の出現であると想定しているが、想定が無効な場合は機能しない。
devildelta

3

Mavenプロジェクトバージョンを出力し[INFO]Downloadメッセージやメッセージからの不要な出力を抑制する、わかりやすいオールインワンソリューション:

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

同じことですが、2行に分割します。

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

出力: 4.3-SNAPSHOT

したがって、project.version単純なbashスクリプトでを使用すると、

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

このページの他のソリューションは、すべてのトリックを1つにまとめているようには見えませんでした。



3

これは、はるかに簡単なbashカットアンドペーストソリューションです。

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

反響する

1.4

2

自分に合ったバランスを見つけました。mvn packagemaven-archiverプラグインがtarget/maven-archiver/pom.propertiesこのようなコンテンツで作成した後

version=0.0.1-SNAPSHOT
groupId=somegroup
artifactId=someArtifact

そして私はそれを実行するためだけにbashを使用しています

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

その後

echo $version
0.0.1-SNAPSHOT

もちろん、このファイルを実行するのは安全ではありませんが、実行を簡単にperlまたはbashスクリプトに変換して、そのファイルから環境変数を読み取って設定することができます。


1

これはオフラインでmvnに依存せずに機能しました:

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

1

EnvInjectプラグインを介して出力をファイルにリダイレクトし、ジョブ環境に戻すことができるため、Execプラグインは出力解析なしで機能します。

ここに画像の説明を入力してください


1

質問に基づいて、私は以下のスクリプトを使用して、すべてのmaven親/サブモジュールのバージョン番号を自動的に増やします:

#!/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。2番目のアプローチの唯一の欠点は、<version/>タグの値を非常に簡単に抽出できることですが、それがリテラル、つまりMavenプロパティでない場合にのみ意味があります。とにかく私はこのアプローチを選びました:

  • 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

私のマシンの違いは2桁以上です。


0

私はTravisの仕事中にこの要件を正確に必要としていますが、複数の値が必要です。私はこの解決策から始めますが、複数回呼び出すと、これは非常に遅くなります(5つの式が必要です)。

pom.xmlの値を.shファイルに抽出する単純なmavenプラグインを作成しました。

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

UNIXシェルでワンライナーを使用しています...

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

この行はシェルスクリプトまたはエイリアスとして非表示にできます。


-1

これは上からの編集です

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

同じの別のバージョンです。mvnがインストールされていないk8sのJenkins CIのバージョン番号を取得する必要があるため、これが最も役立ちます

皆さんありがとう。


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

Mavenの出力sedから抽出するために最近実装した小さなフィルターの改善を追加していproject.versionます。


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

これは私がバージョン番号を取得するために使用したものですが、それを行うにはより優れたmavenの方法があったと思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.