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

이전에는 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)

이것이 누군가를 돕기를 바랍니다.



답변

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

  • help:evaluate 대화식 모드에서 사용자가 제공 한 Maven 표현식을 평가합니다.

다음은 명령 행에서이를 호출하여 ${project.version}다음 을 얻는 방법입니다 .

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


답변

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

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


답변

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

  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 )


답변

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


답변

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

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


답변

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

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


답변

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

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뿐만 아니라, 확인 이 답변을 .