Ранее я выпустил вопрос о том, как изменить версию проекта 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)
Надеюсь, это кому-нибудь поможет.
источник
grep -e '^[[:digit:]]'
Ответы:
Maven Помощь Plugin каким - то образом уже предлагает что - то для этого:
Вот как вы бы вызвали его в командной строке, чтобы получить
${project.version}
:источник
[INFO]
сообщения? Я не нашел переключатель для Maven. В противном случае я просто добавлю несколько сценариев командной строки для анализа номера версии.mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
. Чтобы захватить его в переменной в Bash, используйтеversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Решение Тома с плагином Exec Maven гораздо лучше, но все же сложнее, чем нужно. Для меня это так просто, как:
источник
mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
-Dexec.args='${project.groupId}:${project.artifactId}:${project.version}'
.[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
пожимаю плечами еще один ответ, который не работает для меня, о хорошоset -o errexit
Я провел некоторые исследования и обнаружил следующее:
Maven обвиняют в том, что интеграция с инструментами DevOps не легка из-за того, что она не следует некоторым хорошим практикам в отношении инструментов CLI. (ссылка: https://youtu.be/1ILEw6Qca3U?t=372 )
Вдохновленный предыдущим утверждением, я решил взглянуть на исходный код maven, а также на maven-help-plugin. Похоже, что они немного исправили ключ -q maven (я использую версию 3.5.3), так что теперь, если вы пропустите его, вы не получите всю раздражающую логику, которая не позволяет использовать maven в рамках автоматизированных сценариев. Таким образом, вы должны быть в состоянии использовать что-то вроде этого:
Проблема в том, что эта команда ничего не печатает, потому что по умолчанию плагин справки выводится через регистратор, который был отключен ключом -q. (последняя доступная версия плагина - 3.1.0, выпущенная 3 июня 2018 г.)
Карл Хайнц Марбез ( https://github.com/khmarbaise ) исправил это, добавив необязательный параметр, который позволяет вызывать его следующим образом:
Описание фиксации доступно по адресу: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )
источник
-q
переключатель, он правильно печатает версию (между строками журнала). Любые идеи?-q
коммутатором.-q -DforceStdout
пустым, даже при условии, что версия plugin 3.1.0 использовалась с pluginManagement); я настроил maven обертку с версией 3.5.4 maven, и она работала правильноисточник
2> /dev/null
как иначе вы можете получитьPicked up _JAVA_OPTIONS:
| findstr /v "["
.Верхний ответ, по моему мнению, довольно мусор, вы должны использовать кучу grep, чтобы взломать вывод консоли maven. Почему бы не использовать правильный инструмент для работы? Использование синтаксиса xpath - лучший подход к получению номера версии, поскольку это предполагаемый метод доступа к структуре данных XML. Выражение ниже пересекает pom, используя «локальное имя» элементов, другими словами, игнорируя объявления пространства имен, которые могут присутствовать или не присутствовать в xml.
источник
mvn
является правильным подходом, иexec
плагин на самом деле работает хорошо, но все решения mvn должны разрешаться, и я пытаюсь запустить конвейер сборки, где разрешение зависимостей не будет работать, поэтому я собираюсь заменитьexec
подход этим решением. К счастью, мне не нужно беспокоиться о версиях, унаследованных от родителей.${revision}
например. Ссылка maven.apache.org/maven-ci-friendly.htmlЭто позволит избежать необходимости извлечения записей журнала из выходных данных:
источник
Это самое чистое решение, которое я нашел:
Преимущества:
pom.xml
Примечание:
maven-help-plugin
версия3.2.0
(и выше) имеетforceStdout
опцию. Вы можете заменить3.2.0
приведенную выше команду более новой версией из списка доступных версий mvn-help-plugin из артефакта, если он доступен.-q
подавляет подробные сообщения ([INFO]
и[WARN]
т. Д.)Если вы хотите получать
groupId
иartifactId
как хорошо, проверить этот ответ .источник
Пока у вас есть Python 2.5 или выше, это должно работать. Если у вас версия ниже этой, установите
python-lxml
и измените импорт на lxml.etree. Этот метод быстрый и не требует загрузки дополнительных плагинов. Он также работает с искаженными файлами pom.xml, которые не проверяются с помощью xmllint, например, те, которые мне нужно проанализировать. Протестировано на Mac и Linux.источник
Я продолжал сталкиваться с дополнительными случаями, когда использовал некоторые другие ответы здесь, так что вот еще одна альтернатива.
источник
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
Если вы не против записать версию во временный файл, есть другое решение (без grep / sed), которое мне подходит. ( РЕДАКТИРОВАТЬ : см . Ответ Rjrjr для гораздо более простого решения без каких-либо временных файловых хлопот)
Я использую Exec Maven Plugin вместе с
echo
бинарным. В отличие от плагина справки Maven, плагин Exec позволяет перенаправлять вывод в файл, который можно использовать для обхода grep / sed, и даже позволяет анализировать странные вещи, такие как строки многострочных версий (с блоком CDATA в теге версии), по крайней мере, в определенной степени.источник
Для справки: можно настроить ведение журнала простого 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
В результате можно просто запустить
tail -1
и получить:Обратите внимание, что это однострочник.
MAVEN_OPTS
переписываются только для этого конкретногоmvn
исполнения.источник
Я заметил,
Downloaded:
что на выходе появились ложные строки, нарушающие мое первоначальное назначение. Вот фильтр, на котором я остановился; Надеюсь, поможет!РЕДАКТИРОВАТЬ
Не уверен на 100%, почему, но при запуске этого сценария после пост-сборки в Jenkins вывод получился как
[INFO]version
, например[INFO]0.3.2
.Я выгрузил вывод в файл и пропустил его через мой первый фильтр напрямую из BASH, он отлично работает ... так что, опять же, не уверен, что происходит на земле Дженкинс.
Чтобы получить 100% в Jenkins, я добавил дополнительный
sed
фильтр; вот мой последнийРЕДАКТИРОВАТЬ
Последнее замечание здесь .. Я узнал,
tr
был еще в результате чего такие вещи , как/r/n0.3.2
(опять же только при работе через Jenkins). Перешел наawk
и проблема ушла! Мой окончательный рабочий результатисточник
Простое решение только для Maven
А за бонусные очки разбирается часть версии
источник
Недавно я разработал плагин Release Candidate Maven, который решает именно эту проблему, так что вам не нужно прибегать к каким-либо хакерским сценариям оболочки и анализировать выходные данные
maven-help-plugin
.Например, чтобы распечатать версию вашего проекта Maven на терминале, запустите:
который дает результат , аналогичный
maven-help-plugin
:Однако вы также можете указать произвольный формат вывода (чтобы версия могла быть выбрана из журнала сервером CI, таким как TeamCity ):
Что приводит к:
Чтобы сохранить выходные данные в файл (чтобы его мог использовать CI-сервер, такой как Jenkins ):
Полученный
version.properties
файл будет выглядеть следующим образом:Помимо всего вышеперечисленного, Release Candidate также позволяет вам установить версию вашего проекта (что вы, вероятно, будете делать на своем CI-сервере) на основе версии API, которую вы определили в своем POM.
Если вы хотите, чтобы пример Release Candidate использовался как часть жизненного цикла Maven, взгляните на
pom.xml
мой другой проект с открытым исходным кодом - Build Monitor for Jenkins .источник
Существует также один вариант без необходимости Maven:
источник
grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p
Для получения третьего вхождения используйте:grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p
и так далееПростое для понимания решение «все в одном», которое выводит версию проекта maven и подавляет посторонние выходные данные
[INFO]
иDownload
сообщения:То же самое, но разбить на две строки:
Выходы:
4.3-SNAPSHOT
Итак, используя ваш
project.version
в простом скрипте bash:Другие решения на этой странице, похоже, не объединяют все уловки в одно.
источник
Должно быть проще, так как эта ошибка исправлена в maven-help-plugin 3.0.0: MPH-99 Evaluate не выводит в тихом режиме .
источник
На сегодняшний день это самое простое решение для Bash Cut and Paste:
это отголоски
источник
Я нашел правильный баланс для меня. После того, как
mvn package
плагин maven-archiver создаетtarget/maven-archiver/pom.properties
с таким содержимыми я использую Bash только для его выполнения
затем
Конечно, запуск этого файла вовсе не является безопасным, но его можно легко преобразовать в сценарий perl или bash для чтения и установки переменной окружения из этого файла.
источник
Это работало для меня, в автономном режиме и вне зависимости от mvn:
источник
Плагин Exec работает без разбора вывода, потому что вывод может быть перенаправлен в файл и вставлен обратно в рабочую среду через плагин EnvInject:
источник
Основываясь на вопросе, я использую этот скрипт ниже, чтобы автоматически увеличить мой номер версии во всех родительских / подмодулях maven:
источник
Либо у вас есть
mvn
ответ (как подсказывает большинство ответов), либо вы извлекаете ответ изpom.xml
. Единственным недостатком второго подхода является то, что вы можете очень легко извлечь значение<version/>
тега, но оно будет иметь смысл только в том случае, если оно буквально , то есть не является свойством Maven. Я все равно выбрал этот подход, потому что:mvn
это способ многословия, и я просто не люблю фильтровать его вывод.mvn
очень медленный по сравнению с чтениемpom.xml
.<version/>
.mvn-version
этоzsh
скрипт , который использует ,xmlstarlet
чтобы прочитатьpom.xml
и распечатать версию проекта (если она существует) или версии родительского проекта (если она существует):Преимущество в том, что это намного быстрее, чем бег
mvn
:Разница на моей машине больше двух порядков.
источник
Мне нужно именно это требование во время моей работы в Travis, но с несколькими значениями. Я начинаю с этого решения, но при многократном вызове это очень медленно (мне нужно 5 выражений).
Я написал простой плагин maven для извлечения значений pom.xml в файл .sh.
https://github.com/famaridon/ci-tools-maven-plugin
Будет производить это:
теперь вы можете просто получить файл
Радоваться, веселиться.
источник
Я использую однострочник в моей оболочке Unix ...
Вы можете скрыть эту строку в сценарии оболочки или как псевдоним.
источник
это редактирование сверху
Я проверил это на cmdline работает хорошо
grep "" pom.xml | голова -n 1 | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g"
это другая версия того же. У меня есть потребность получить номер версии в Jenkins CI в k8s без установленного mvn, так что это очень полезно
Спасибо всем.
источник
Я просто добавляю небольшое
sed
улучшение фильтра, которое я недавно реализовал, чтобы извлечьproject.version
из вывода maven.источник
Это то, что я использовал, чтобы получить номер версии, думал, что был бы лучший способ сделать это Maven
источник