maven-2 리눅스 빌드 - Maven 프로젝트 버전을 bash 명령 행으로 가져 오는 방법





11 Answers

Exec Maven Plugin을 사용한 Tom의 솔루션은 훨씬 뛰어 났지만 필요 이상으로 복잡합니다. 나에게 그것은 간단하다.

set -o errexit

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

이전 Maven 프로젝트 vesion을 커맨드 라인 에서 새로운 문제 로 바꾸는 방법에 대한 질문을했습니다.

이전 버전에서는 grep 및 명령 행 (bash)에서 구문 분석하기 쉬운 특성으로 버전이 저장되었으므로 버전 번호를 얻을 수있었습니다. 이제는 pom.xml 요소가이 용도로 사용되었으므로 더 이상 모든 종속성과 일부 다른 것들이 이것을 사용하므로 고유하지 않습니다. 나는 xml을 파싱하거나 매우 context-aware sed 명령을 구문 분석하기위한 외부 도구 없이 bash 스크립트로 현재 버전 번호를 얻는 방법이 없다고 생각한다.

저의 의견에 가장 깨끗한 해결책은 Maven이이 버전 정보를 나눠 주도록하는 것입니다. 다른 속성을 검색하기위한 커스텀 메이븐 플러그인을 작성할 생각 이었지만 여기서 먼저 물어볼 것이라고 생각했습니다.

그래서, ${project.version} 의 값을 명령 행으로 가져 오는 쉬운 방법이 있습니까? 미리 감사드립니다.

해결책

도움을 주셔서 감사합니다. 수동으로 디렉토리로 이동해야했지만 쉽게 할 수 있습니다. 내 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)

희망이 사람을 도움이됩니다.




가장 큰 대답은 제 의견으로는 꽤 쓰레기입니다. 여러분은 maven 콘솔 출력을 해킹하기 위해 grep을 사용해야합니다. 왜 직장에 맞는 도구를 사용하지 않습니까? xpath 구문을 사용하는 것이 XML 데이터 구조에 액세스하기위한 의도 된 방법이므로 버전 번호를 검색하는 가장 좋은 방법입니다. 아래 표현식은 요소의 "로컬 이름"을 사용하여 pom을 탐색합니다. 즉 xml에 존재하거나 존재하지 않을 수있는 네임 스페이스 선언을 무시합니다.

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



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에서 테스트되었습니다.




나는 여기에 다른 답변을 사용할 때 부작용에 빠지기 때문에 여기 또 다른 대안이있다.

version=$(printf 'VER\t${project.version}' | mvn help:evaluate | grep '^VER' | cut -f2)



나는 약간의 가짜 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')

편집하다

마지막으로 여기에서 한 가지 메모를 해 /r/n0.3.2 tr여전히 /r/n0.3.2 와 같은 결과를 /r/n0.3.2 (Jenkins를 경유했을 때만). awkawk 문제는 사라졌습니다! 나의 최종 결과

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



간단한 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}'



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

따라서 간단한 bash 스크립트에서 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"

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




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




당신은 mvn 에게 답을 주거나 (대부분의 대답이 제시하는 것처럼) pom.xml 에서 대답을 추출합니다. 두 번째 접근법의 유일한 단점은 <version/> 태그의 값을 매우 쉽게 추출 할 수 있지만 리터럴 , 즉 Maven 속성이 아닌 경우에만 의미가 있다는 것입니다. 어쨌든 다음과 같은 이유로이 방법을 선택했습니다.

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

mvn-versionxmlstarlet 을 사용하여 pom.xml 을 읽고 프로젝트 버전 (존재하는 경우) 또는 상위 프로젝트 버전 (존재하는 경우)을 인쇄하는 zsh 쉘 스크립트입니다.

$ 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 배 이상입니다.




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 출력에서 project.version 을 추출하기 위해 구현 한 작은 sed 필터 개선을 추가하고 있습니다.




Maven 바닥 글은 꽤 표준 적입니다.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.609s
[INFO] Finished at: Wed May 21 18:02:38 MSK 2014
[INFO] Final Memory: 17M/736M
[INFO] ------------------------------------------------------------------------

따라서 다음 코드를 사용할 수 있습니다.

> version=$(mvn help:evaluate -Dexpression=project.version | tail -8 | head -1)
> echo $version



Related