Как получить версию проекта 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 ]

0 голосов
/ 14 марта 2019

Я использую однострочную оболочку в моей оболочке Unix ...

cat pom.xml |grep "" |голова -n 1 |sed -e "s / version // g" |sed -e "s / \ s * [<> /] * // g"

Вы можете скрыть эту строку в сценарии оболочки или в качестве псевдонима.

0 голосов
/ 21 мая 2014

Нижний колонтитул 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
0 голосов
/ 29 ноября 2016

Либо у вас есть mvn дать вам ответ (как подсказывает большинство ответов), либо вы извлекаете ответ из pom.xml.Единственным недостатком второго подхода является то, что вы можете очень легко извлечь значение тега <version/>, но оно будет иметь смысл только в том случае, если это литерал , то есть не свойство Maven.Я все равно выбрал этот подход, потому что:

  • mvn - это способ многословия, и я просто не люблю фильтровать его вывод.
  • Запуск mvn очень медленный по сравнению с чтениемpom.xml.
  • Я всегда использую литеральные значения в <version/>.

mvn-version - это zsh сценарий оболочки, который использует xmlstarlet чтобы прочитать pom.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 голосов
/ 08 июля 2015
VERSION=$(head -50 pom.xml | awk -F'>' '/SNAPSHOT/ {print $2}' | awk -F'<' '{print $1}')

Это то, что я использовал, чтобы получить номер версии, думал, что был бы лучший способ сделать это maven

0 голосов
/ 24 ноября 2015

Это работало для меня, в автономном режиме и без зависимости от mvn:

VERSION=$(grep --max-count=1 '<version>' <your_path>/pom.xml | awk -F '>' '{ print $2 }' | awk -F '<' '{ print $1 }')
echo $VERSION
0 голосов
/ 30 июля 2012
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.version из вывода maven.

...