Maven 프로젝트 버전을 bash 명령 줄로 가져 오는 방법


201

이전에는 Maven 프로젝트 vesion을 명령 줄에서 변경 하여 새로운 문제를 일으키는 방법에 대한 질문을했습니다 .

이전에는 버전이 명령 줄 (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

1
빠른 실행을 위해 MVN -o 있는지 확인
나단 Bubna

2
복잡한 sed 표현을 간단한 것으로 대체 할 수 있습니다grep -e '^[[:digit:]]'
bpedman

2
@NathanBubna가 권장하는대로 -o를 사용하면 maven이 '오프라인'모드가됩니다. maven 도움말 플러그인과 종속 jar 파일이 아직 다운로드되지 않은 경우 빌드가 실패합니다. 그것에 의해 조금 불타 버렸습니다, 그것이 다른 누군가를 돕기를 바랍니다.
phillipuniverse

답변:


217

메이븐 도움말 플러그인은 어떻게 든 이미 뭔가를 제안하고있다 :

  • 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 등) 및 'Download'메시지를 제거합니다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 ash

40
@montoyaed는 가장 좋은 답변 을 게시했습니다 mvn help:evaluate -Dexpression=project.version -q -DforceStdout. Bash에서 변수로 캡처하려면version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Sebastian Thomschke

200

Exec Maven Plugin을 사용한 Tom의 솔루션 은 훨씬 우수하지만 여전히 필요한 것보다 더 복잡합니다. 나를 위해 다음과 같이 간단합니다.

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 어깨를 으쓱 아직 나를 위해 일을하지 않는 다른 답변, 오, 잘
cbmanica

깨지기 쉬운 grep / sed 명령 또는 이와 유사한 명령을 적용 할 필요가 없기 때문에 이것이 지금까지 내가 본 최고의 솔루션입니다.
Mike76

무엇입니까set -o errexit
theonlygusti

80

나는 약간의 연구를 해왔고 다음을 발견했다.

  1. CLI 도구와 관련된 몇 가지 모범 사례를 따르지 않기 때문에 DevOps 도구와의 통합이 쉽지 않기 때문에 Maven은 비난을 받았습니다. (참조 : https://youtu.be/1ILEw6Qca3U?t=372 )

  2. 이전 주장에서 영감을 얻어 maven-help-plugin뿐만 아니라 maven의 소스 코드를 살펴보기로 결정했습니다. 그들은 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는 시도하지 않았습니다) 간단합니다. 감사합니다.
휴지통 80

1
@montoyaedu 응답이 없습니다. 그 동안 나는 -q스위치 와 함께 잘 작동하는 maven 3.5.4로 업데이트했다 .
gucce

1
@gucce 나는 사용 된 maven 버전이 이것에 영향을 미친다는 것을 확인할 수있다 : 3.5.2 (데비안 9의 패키지 버전)에서는 출력 -q -DforceStdout이 비어 있었고 플러그인의 버전 3.1.0이 pluginManagement와 함께 사용 되었음); maven 래퍼 버전 3.5.4를 사용하여 maven 래퍼를 구성했으며 올바르게 작동했습니다.
Gorkk

3
마지막으로 2019 년 grep이없는 실용적인 솔루션-이것이 받아 들여야합니다. 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을
나단 Bubna에게

1
아래의 'Downloaded :'라인을 필터링하는 내 답변 (quickshiftin)을 참조하십시오.
quickshiftin

10
@NathanBubna가 권장하는대로 -o를 사용하면 maven이 '오프라인'모드가됩니다. maven 도움말 플러그인과 종속 jar 파일이 아직 다운로드되지 않은 경우 빌드가 실패합니다. 그것에 의해 조금 불타 버렸습니다, 그것이 다른 누군가를 돕기를 바랍니다.
phillipuniverse

2> /dev/null다른 방법으로 얻을 수도 있습니다Picked up _JAVA_OPTIONS:
Jakub

2
Windows에서는 명령 끝을로 바꾸십시오 | findstr /v "[".
Tunaki

39

가장 좋은 대답은 내 의견으로는 꽤 쓰레기입니다. 많은 grep을 사용하여 maven 콘솔 출력을 해킹해야합니다. 작업에 적합한 도구를 사용하지 않는 이유는 무엇입니까? XML 데이터 구조에 액세스하기위한 방법이므로 xpath 구문을 사용하는 것이 버전 번호를 검색하는 가장 좋은 방법입니다. 아래 표현식은 요소의 "로컬 이름"을 사용하여 pom을 순회합니다. 즉, XML에 있거나 없을 수있는 네임 스페이스 선언을 무시합니다.

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

@bobmarksie 나는 두 번째; maven을 사용하고 regexp로 출력을 문지르는 것은 고통 스럽습니다.
mhvelplund

3
부모 폼폼에서 상속받은 프로젝트는 어떻습니까?
Wes

2
"왜 작업에 적합한 도구를 사용하지 않습니까?" IE! 메이븐?
jeremyjjbrown 2016 년

나는 사용하는 mvn것이 올바른 접근법이고 exec플러그인은 실제로 훌륭하게 작동 한다는 것을 이해 하지만 모든 mvn 솔루션은 해결해야하며 종속성 해결이 작동하지 않는 빌드 파이프 라인을 부트 스트랩하려고 시도하므로 exec접근 방식을이 솔루션 으로 대체하려고합니다 . 운 좋게도 부모로부터 상속받은 버전에 대해 걱정할 필요가 없습니다.
haridsv

${revision}예를 들어 버전이 속성과 같은 친숙한 버전 관리에서는 작동하지 않습니다 . 참조 maven.apache.org/maven-ci-friendly.html
Ed Randall

30

이렇게하면 출력에서 ​​로그 항목을 제거 할 필요가 없습니다.

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

이 코드는 질문에 대답 할 수 있지만, 질문에 대한 이유 및 / 또는 방법 에 대한 추가 컨텍스트를 제공 하면 장기적인 가치가 크게 향상됩니다. 제발 편집 약간의 설명을 추가 할 답변을.
Toby Speight

1
이 방법을 사용하려면 mvn 뒤에 "-q"를 넣어야합니다.
Rudge

이것은 허용 된 솔루션보다 낫습니다. maven 시끄러운 출력을 걸러 낼 필요가 없습니다.
Willian Mitsuda

19

이것이 내가 찾은 가장 깨끗한 솔루션입니다 .

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

장점 :

  • 이것은 모든 운영 체제와 모든 셸 에서 잘 작동합니다 .
  • 외부 도구가 필요 없습니다!

노트 :

  • maven-help-plugin버전 3.2.0이상에는 forceStdout옵션 이 있습니다. 사용 가능한 경우 아티팩트에서 사용 가능한 mvn-help-plugin 버전3.2.0 목록에서 위 명령을 최신 버전으로 바꿀 수 있습니다.
  • 옵션 -q메시지 자세한 억압 ( [INFO], [WARN]등)

당신이 가져하려는 경우 groupIdartifactId뿐만 아니라, 확인 이 답변을 .


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로 변경하십시오. 이 방법은 빠르며 추가 플러그인을 다운로드 할 필요가 없습니다. 또한 구문 분석 해야하는 것과 같이 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

7

임시 파일에 버전을 쓰지 않으려면 grep / sed가없는 다른 솔루션이 있습니다. ( 편집 : 임시 파일 번거 로움없이 훨씬 간단한 솔루션에 대한 rjrjr의 답변 참조 )

내가 사용 Exec에서 메이븐 플러그인을 와 함께 echo바이너리. Maven Help Plugin과 달리 Exec Plugin은 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 : exec-maven-plugin : 1.3.1 : exec
rjrjr

rjrjr : 좋아! 여기서 언급해야 할 유일한 것은 오류 처리입니다. mvn이 실패하면 잘못된 버전 문자열이 나타납니다. 따라서 mvn 리턴 코드 또는 문자열 자체 확인과 같은 일부 유효성 검증이 필요합니다.
Tom

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에서 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 플러그인을 개발하여 해키 셸 스크립트에 의존하지 않고의 출력을 구문 분석 할 필요가 없습니다 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 라이프 사이클의 일부로 사용되는 Release Candidate의 예를 보려면 pom.xml다른 오픈 소스 프로젝트 인 Build Monitor for Jenkins를 살펴보십시오 .


5

Maven이 필요없는 옵션도 있습니다.

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

이것은 pom에서 처음 나타나는 것만 보여줍니다. 필자의 경우 첫 번째 발생은 부모 pom 버전을 제공합니다. 그러나 솔직히 이것은 내가 찾고있는 대답입니다. 앞에서 언급 한 솔루션보다 훨씬 빠르며 올바르게 발생하도록 수정하기 쉽습니다. 두 번째 항목을 사용하려면 : grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p세 번째 항목을 사용하려면 다음 grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p과 같이하십시오.
Krzysztof Cieśliński

version 요소가 첫 번째 것으로 가정하고 가정이 유효하지 않으면 작동하지 않습니다.
devildelta

3

maven 프로젝트 버전을 출력하고 외부의 메시지 [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간단한 bash 스크립트에서을 사용하십시오 .

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

이 페이지의 다른 솔루션은 모든 트릭을 하나로 결합하지는 않았습니다.



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

물론 이것은이 파일을 실행하는 데 전혀 안전하지는 않지만 실행을 펄 또는 bash 스크립트로 쉽게 변환하여 해당 파일에서 환경 변수를 읽고 설정할 수 있습니다.


1

이것은 mvn에 의존하지 않고 오프라인으로 저에게 효과적이었습니다.

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

1

Exec 플러그인은 출력을 파일로 리디렉션하고 EnvInject 플러그인을 통해 작업 환경으로 다시 주입 할 수 있으므로 출력 구문 분석없이 작동합니다.

여기에 이미지 설명을 입력하십시오


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. 두 번째 접근 방식의 유일한 단점은 <version/>태그 의 값을 매우 쉽게 추출 할 수 있다는 것이지만, 그것이 리터럴 인 경우에만 , 즉 Maven 속성이 아닌 경우에만 의미가 있습니다 . 어쨌든이 접근법을 선택했습니다.

  • mvn 자세한 방법이며 출력을 필터링하는 것을 좋아하지 않습니다.
  • mvn읽기 시작 과 비교하여 시작 이 매우 느립니다.pom.xml .
  • 나는 항상 리터럴 값을 사용합니다. <version/> .

mvn-versionzsh사용 하는 쉘 스크립트입니다xmlstarletpom.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

Travis 작업 중에이 값이 정확히 필요하지만 여러 값이 필요합니다. 이 솔루션으로 시작 합니다 하지만 여러 번 호출 할 때 매우 느립니다 (5 Expesions 필요).

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

유닉스 쉘에서 하나의 라이너를 사용하고 있습니다 ...

고양이 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'

sed최근에 project.versionmaven 출력에서 추출하기 위해 구현 한 작은 필터 개선 사항을 추가 하고 있습니다 .


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