[maven-2] Maven 프로젝트 버전을 bash 명령 행으로 가져 오는 방법


9 Answers

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

set -o errexit

MVN_VERSION=$(mvn -q \
    -Dexec.executable="echo" \
    -Dexec.args='${project.version}' \
    --non-recursive \
    org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
Question

이전 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 바닥 글은 꽤 표준 적입니다.

[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



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)



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







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"

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




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

이것은 내가 버전 번호를 얻는데 사용했던 것입니다. 그렇게하는 것이 더 좋은 방법 일 것이라고 생각했습니다.




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

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



단지 기록을 위해 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 문서화되어 있습니다 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 실행에 대해서만 재 작성됩니다.




Related