Как получить версию проекта Maven в командной строке bash

201

Ранее я выпустил вопрос о том, как изменить версию проекта 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)

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

mkko
источник
1
Решение, кажется, пропускает ', чтобы закончить выражение sed.
Наврот
Который Sed Exp? Я не могу заметить.
Mkko
1
сделать это mvn -o для более быстрого выполнения
Натан Бубна
2
Вы можете заменить это сложное выражение sed простымgrep -e '^[[:digit:]]'
bpedman
2
Если вы используете -o в соответствии с рекомендациями @NathanBubna, это переведет maven в автономный режим. Если у вас еще не загружен плагин помощи maven и загружены зависимые файлы jar, сборка завершится неудачно. Это сгорело немного, надеюсь, это поможет кому-то еще.
phillipuniverse

Ответы:

217

Maven Помощь Plugin каким - то образом уже предлагает что - то для этого:

  • help:evaluate оценивает выражения Maven, заданные пользователем в интерактивном режиме.

Вот как вы бы вызвали его в командной строке, чтобы получить ${project.version}:

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
    -Dexpression=project.version
Паскаль Тивент
источник
8
Хорошо спасибо. Я думаю, что это самое близкое, что я доберусь до чистого решения. Любые идеи, как я могу превзойти вывод Maven и отфильтровать эти [INFO]сообщения? Я не нашел переключатель для Maven. В противном случае я просто добавлю несколько сценариев командной строки для анализа номера версии.
MKKO
80
Я удаляю все сообщения журнала (INFO, WARNING и т. Д.) И сообщения «Скачать» с помощьюmvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick
13
не ожидал бы ничего менее многословного от maven
Энди
24
Вот подход , который я одолжение:printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
ясень
40
@montoyaed опубликовал лучший ответ, который просто есть mvn help:evaluate -Dexpression=project.version -q -DforceStdout. Чтобы захватить его в переменной в Bash, используйтеversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Себастьян Томшке
200

Решение Тома с плагином Exec Maven гораздо лучше, но все же сложнее, чем нужно. Для меня это так просто, как:

MVN_VERSION=$(mvn -q \
    -Dexec.executable=echo \
    -Dexec.args='${project.version}' \
    --non-recursive \
    exec:exec)
rjrjr
источник
30
Я думаю, что это самый простой способ, поскольку он не подразумевает использование grep или подобных вещей. Краткое примечание: вы можете сделать его немного короче:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
scrutari
1
Это решение хорошо работает для меня , как я хотел напечатать GroupID, артефакт и версию .. -Dexec.args='${project.groupId}:${project.artifactId}:${project.version}'.
Джеймс Х.
1
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (default-cli) on project audit-events-processor-parent: Command execution failed. Cannot run program "maven" (in directory "/tmp"): error=2, No such file or directory пожимаю плечами еще один ответ, который не работает для меня, о хорошо
cbmanica
Спасибо, это лучшее решение, которое я видел до сих пор, так как оно не требует применения хрупких команд grep / sed или аналогичных
Mike76
Что такоеset -o errexit
theonlygusti
80

Я провел некоторые исследования и обнаружил следующее:

  1. Maven обвиняют в том, что интеграция с инструментами DevOps не легка из-за того, что она не следует некоторым хорошим практикам в отношении инструментов CLI. (ссылка: https://youtu.be/1ILEw6Qca3U?t=372 )

  2. Вдохновленный предыдущим утверждением, я решил взглянуть на исходный код maven, а также на maven-help-plugin. Похоже, что они немного исправили ключ -q maven (я использую версию 3.5.3), так что теперь, если вы пропустите его, вы не получите всю раздражающую логику, которая не позволяет использовать maven в рамках автоматизированных сценариев. Таким образом, вы должны быть в состоянии использовать что-то вроде этого:

    mvn help:evaluate -Dexpression=project.version -q

    Проблема в том, что эта команда ничего не печатает, потому что по умолчанию плагин справки выводится через регистратор, который был отключен ключом -q. (последняя доступная версия плагина - 3.1.0, выпущенная 3 июня 2018 г.)

  3. Карл Хайнц Марбез ( https://github.com/khmarbaise ) исправил это, добавив необязательный параметр, который позволяет вызывать его следующим образом:

    mvn help:evaluate -Dexpression=project.version -q -DforceStdout

    Описание фиксации доступно по адресу: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )

Эдуардо Монтойя
источник
2
Это было бы моим предпочтительным решением и также упоминается на официальных страницах справки . Тем не менее, это не работает для меня. Я на MacOS с Maven v3.5.3. Когда я не использую -qпереключатель, он правильно печатает версию (между строками журнала). Любые идеи?
Gucce
3
Это должен быть принятый ответ. Это работает в Windows и Linux (я не пробовал Max OSX), и это просто. Спасибо.
trash80
1
@montoyaedu Извините, что не ответил. Тем временем я обновился до maven 3.5.4, который отлично работает с -qкоммутатором.
Гучче
1
@gucce Я могу подтвердить, что используемая версия maven влияет на это: в 3.5.2 (версия пакета в Debian 9) вывод с -q -DforceStdoutпустым, даже при условии, что версия plugin 3.1.0 использовалась с pluginManagement); я настроил maven обертку с версией 3.5.4 maven, и она работала правильно
Gorkk
3
Наконец, практическое решение без grep для 2019 года (это должно стать принятым ответом). Работает и с CI-дружественными версиями - протестировано на 3.3.9, 3.5.3, 3.5.4, 3.6.0
Эд Рэндалл,
47
mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['
user1712021
источник
2
сделать это mvn -o для более быстрого выполнения
Натан Бубна
1
Смотрите мой ответ (quickshiftin) ниже, который также фильтрует строки «Downloaded:».
Quickshiftin
10
Если вы используете -o в соответствии с рекомендациями @NathanBubna, это переведет maven в автономный режим. Если у вас еще не загружен плагин помощи maven и загружены зависимые файлы jar, сборка завершится неудачно. Это сгорело немного, надеюсь, это поможет кому-то еще.
phillipuniverse
Вы можете также добавить, 2> /dev/nullкак иначе вы можете получитьPicked up _JAVA_OPTIONS:
Якуб Боченски
2
В Windows замените конец команды на | findstr /v "[".
Тунаки
39

Верхний ответ, по моему мнению, довольно мусор, вы должны использовать кучу grep, чтобы взломать вывод консоли maven. Почему бы не использовать правильный инструмент для работы? Использование синтаксиса xpath - лучший подход к получению номера версии, поскольку это предполагаемый метод доступа к структуре данных XML. Выражение ниже пересекает pom, используя «локальное имя» элементов, другими словами, игнорируя объявления пространства имен, которые могут присутствовать или не присутствовать в xml.

xmllint --xpath "//*[local-name()='project']/*[local-name()='version']/text()" pom.xml
lukeforehand
источник
@bobmarksie Я второй это; использование maven и очистка вывода с помощью регулярных выражений является болезненным.
mhvelplund
3
Как насчет проекта, который наследуется от родительского пом.
Уэс
2
«Почему бы не использовать правильный инструмент для работы?» IE! Maven?
jeremyjjbrown
Я понимаю, что использование mvnявляется правильным подходом, и execплагин на самом деле работает хорошо, но все решения mvn должны разрешаться, и я пытаюсь запустить конвейер сборки, где разрешение зависимостей не будет работать, поэтому я собираюсь заменить execподход этим решением. К счастью, мне не нужно беспокоиться о версиях, унаследованных от родителей.
haridsv
Это не будет работать с версией ci-friendly, где версия - это свойство, ${revision}например. Ссылка maven.apache.org/maven-ci-friendly.html
Эд Рэндалл,
30

Это позволит избежать необходимости извлечения записей журнала из выходных данных:

mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q
Хосе Албан
источник
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как он отвечает на вопрос, значительно улучшит его долгосрочную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения.
Тоби Спейт
1
Я думаю, что для этого подхода необходимо поставить «-q» после mvn.
Радж
Это лучше, чем принятое решение; нет необходимости отфильтровывать шум с шумом.
Виллиан Мицуда
20

Это самое чистое решение, которое я нашел:

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

Преимущества:

  • Это прекрасно работает на всех операционных системах и всех оболочках.
  • Нет необходимости в каких-либо внешних инструментах!
  • [важно] Это работает, даже если версия проекта наследуется от родительского pom.xml

Примечание:

  • maven-help-pluginверсия 3.2.0(и выше) имеет forceStdoutопцию. Вы можете заменить 3.2.0приведенную выше команду более новой версией из списка доступных версий mvn-help-plugin из артефакта, если он доступен.
  • Опция -qподавляет подробные сообщения ( [INFO]и [WARN]т. Д.)

Если вы хотите получать groupIdи artifactIdкак хорошо, проверить этот ответ .

Ману Манджунатх
источник
13
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)"

Пока у вас есть Python 2.5 или выше, это должно работать. Если у вас версия ниже этой, установите python-lxmlи измените импорт на lxml.etree. Этот метод быстрый и не требует загрузки дополнительных плагинов. Он также работает с искаженными файлами pom.xml, которые не проверяются с помощью xmllint, например, те, которые мне нужно проанализировать. Протестировано на Mac и Linux.

прецизионный самописец
источник
12

Я продолжал сталкиваться с дополнительными случаями, когда использовал некоторые другие ответы здесь, так что вот еще одна альтернатива.

version=$(printf 'VER\t${project.version}' | mvn help:evaluate | grep '^VER' | cut -f2)
медленный
источник
1
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
Егений
7

Если вы не против записать версию во временный файл, есть другое решение (без grep / sed), которое мне подходит. ( РЕДАКТИРОВАТЬ : см . Ответ Rjrjr для гораздо более простого решения без каких-либо временных файловых хлопот)

Я использую Exec Maven Plugin вместе с echoбинарным. В отличие от плагина справки Maven, плагин Exec позволяет перенаправлять вывод в файл, который можно использовать для обхода grep / sed, и даже позволяет анализировать странные вещи, такие как строки многострочных версий (с блоком CDATA в теге версии), по крайней мере, в определенной степени.

#!/usr/bin/env sh

MVN_VERSION=""
VERSION_FILE=$( mktemp mvn_project_version_XXXXX )
trap "rm -f -- \"$VERSION_FILE\"" INT EXIT

mvn -Dexec.executable="echo" \
    -Dexec.args='${project.version}' \
    -Dexec.outputFile="$VERSION_FILE" \
    --non-recursive \
    --batch-mode \
    org.codehaus.mojo:exec-maven-plugin:1.3.1:exec > /dev/null 2>&1 ||
    { echo "Maven invocation failed!" 1>&2; exit 1; }

# if you just care about the first line of the version, which will be
# sufficent for pretty much every use case I can imagine, you can use
# the read builtin
[ -s "$VERSION_FILE" ] && read -r MVN_VERSION < "$VERSION_FILE"

# Otherwise, you could use cat.
# Note that this still has issues when there are leading whitespaces
# in the multiline version string
#MVN_VERSION=$( cat "$VERSION_FILE" )

printf "Maven project version: %s\n" "$MVN_VERSION"
Том
источник
6
Это гораздо лучшее решение, чем вспомогательный плагин, и вам не нужен весь этот ввод / вывод. Просто добавьте флаг -q и единственным выходом будет версия. Итак: mvn -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' --non-recursive org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec
rjrjr
rjrjr: Отлично! Единственное, что мне нужно здесь упомянуть, это обработка ошибок: если mvn завершается неудачно, вы получаете неверную строку версии. Поэтому требуется некоторая проверка, например, проверка кода возврата mvn или самой строки.
Том
6

Для справки: можно настроить ведение журнала простого SLF4J в Maven непосредственно в командной строке, чтобы выводить только то, что нам нужно, путем настройки:

  • 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

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исполнения.

Степан Вавра
источник
5

Я заметил, 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(опять же только при работе через Jenkins). Перешел на 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=''
quickshiftin
источник
5

Простое решение только для 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

Недавно я разработал плагин 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мой другой проект с открытым исходным кодом - Build Monitor for Jenkins .

Ян Молак
источник
5

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

grep -oPm1 "(?<=<version>)[^<]+" "pom.xml"
Михал Шипек
источник
Этот показывает только первое вхождение в пом. В моем случае первое вхождение дает родительскую версию pom. Но, честно говоря, это ответ, который я искал. Это намного быстрее, чем решения, упомянутые ранее, и его легко изменить, чтобы получить правильное возникновение. Для получения второго вхождения используйте: grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pДля получения третьего вхождения используйте: grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pи так далее
Кшиштоф Цеслинский
Вы предполагаете, что элемент version является первым вхождением, и он не работает, когда предположение неверно.
Devildelta
3

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

На сегодняшний день это самое простое решение для Bash Cut and Paste:

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

это отголоски

1.4
freedev
источник
2

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

Владимир I
источник
1

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

VERSION=$(grep --max-count=1 '<version>' <your_path>/pom.xml | awk -F '>' '{ print $2 }' | awk -F '<' '{ print $1 }')
echo $VERSION
Джордж
источник
1

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

введите описание изображения здесь

Ондржей Кмох
источник
1

Основываясь на вопросе, я использую этот скрипт ниже, чтобы автоматически увеличить мой номер версии во всех родительских / подмодулях maven:

#!/usr/bin/env bash  

# 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/"  
}  

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

new\_version=$(advance\_version $version)  

mvn versions:set -DnewVersion=${new\_version} -DprocessAllModules -DgenerateBackupPoms=false
Ю Цзяо
источник
0

Либо у вас есть 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

Мне нужно именно это требование во время моей работы в Travis, но с несколькими значениями. Я начинаю с этого решения, но при многократном вызове это очень медленно (мне нужно 5 выражений).

Я написал простой плагин maven для извлечения значений pom.xml в файл .sh.

https://github.com/famaridon/ci-tools-maven-plugin

mvn com.famaridon:ci-tools-maven-plugin:0.0.1-SNAPSHOT:environment -Dexpressions=project.artifactId,project.version,project.groupId,project.build.sourceEncoding

Будет производить это:

#!/usr/bin/env bash
CI_TOOLS_PROJECT_ARTIFACTID='ci-tools-maven-plugin';
CI_TOOLS_PROJECT_VERSION='0.0.1-SNAPSHOT';
CI_TOOLS_PROJECT_GROUPID='com.famaridon';
CI_TOOLS_PROJECT_BUILD_SOURCEENCODING='UTF-8';

теперь вы можете просто получить файл

source .target/ci-tools-env.sh

Радоваться, веселиться.

Флоран Амаридон
источник
-1

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

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

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

MichaOnline
источник
-1

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

кот 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, так что это очень полезно

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

Филипп Рафф
источник
-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'

Я просто добавляю небольшое sedулучшение фильтра, которое я недавно реализовал, чтобы извлечь project.versionиз вывода maven.

websigni
источник
-2
VERSION=$(head -50 pom.xml | awk -F'>' '/SNAPSHOT/ {print $2}' | awk -F'<' '{print $1}')

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

Tristik
источник