Как получить версию проекта Maven в командной строке bash - PullRequest
163 голосов
/ 23 августа 2010

Раньше я задавал вопрос на , как изменить версию проекта Maven из командной строки , что привело меня к новой проблеме.

Ранее я мог получить номер версии, начиная с версиибыл сохранен как свойство, которое было легко найти и проанализировать из командной строки (bash).Теперь, когда для этого используется элемент pom.xml, он больше не является уникальным, поскольку все зависимости и, возможно, некоторые другие тоже используют это.Я думаю, что нет способа получить номер текущей версии с помощью bash-скрипта без внешних инструментов для разбора xml или какой-либо очень контекстно-зависимой команды sed.

Самое чистое решение на мой взглядбыло бы для 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 } }'`

, который дает мне текущую версию, которую я могу затем продвинуть.Грэппинг может быть проще, но я подумал, что хотел бы сделать его максимально надежным, поэтому я доволен первой строкой, начинающейся с числа, и попытаюсь обработать это как номер версии.

# 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)

Надеюсь, это кому-нибудь поможет.

Ответы [ 26 ]

5 голосов
/ 13 июля 2017

Простое решение только для 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 голосов
/ 09 октября 2013

Я заметил несколько ложных 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, он работает нормально .., так что опять же, не уверен, что происходит на земле Дженкинс.

Чтобы получить 100% в Jenkins, я добавил дополнительный фильтр 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=''
4 голосов
/ 22 ноября 2015

Я недавно разработал 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] ------------------------------------------------------------------------

Однако вы также можете указать произвольный выходной формат (чтобы версия могла быть извлечена из журнала сервером CI, например TeamCity ):

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

Для сохранения вывода в файл (чтобы сервер CI, такой как Jenkins , мог использовать его ):

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 такжепозволяет установить версию вашего проекта (что вы, вероятно, будете делать на своем CI-сервере) на основе API-версииИон, который вы определили в своем POM.

Если вы хотите, чтобы пример Release Candidate использовался как часть жизненного цикла Maven, взгляните на pom.xml моего другого открытого кода.проект - Сборка монитора для Jenkins .

3 голосов
/ 30 августа 2014

Простое в понимании решение «все в одном», которое выводит версию проекта 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 голосов
/ 09 июня 2019

Это самое чистое решение Я нашел:

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

Отлично работает на всех ОС. Нет необходимости в каких-либо внешних инструментах!

-q подавляет подробные сообщения. maven-help-plugin версия 3.2.0 (и выше) имеет опцию forceStdout.

2 голосов
/ 30 января 2015

Должно быть проще, поскольку эта ошибка исправлена ​​в maven-help-plugin 3.0.0: Оценка MPH-99 не выводится в тихом режиме .

2 голосов
/ 11 ноября 2018

Я нашел правильный баланс для себя.После mvn package плагин maven-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 голос
/ 09 марта 2016

Плагин Exec работает без разбора вывода, потому что вывод может быть перенаправлен в файл и вставлен обратно в рабочую среду через плагин EnvInject:

enter image description here

1 голос
/ 06 мая 2019

Существует также один вариант без необходимости Maven:

grep -oPm1 "(?<=<version>)[^<]+" "pom.xml"
0 голосов
/ 26 апреля 2019

это редактирование сверху

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

- другая версия того же самого.Мне нужно получить номер версии в Jenkins CI в k8s без установленного mvn, так что это очень полезно

спасибо всем.

...