Як отримати версію проекту Maven до командного рядка bash


201

Попередньо я випустив питання про те, як змінити візію проекту Maven з командного рядка, що призвело до нового питання.

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

На мою думку, найчистішим рішенням було б Мевен роздати інформацію про цю версію. Я думав написати спеціальний плагін Maven для отримання різних властивостей, але я подумав, що спочатку запитаю тут.

Отже, чи є простий спосіб отримати значення ${project.version}в командному рядку? Заздалегідь спасибі.

Рішення

Дякую за допомогу. Довелося до cdкаталогу вручну, але це можна зробити легко. У моєму баш сценарії є

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)

Сподіваюся, що це комусь допоможе.


1
Здається, рішення не вистачає ', щоб закінчити вираз sed.
nawroth

Який sed exp? Я не можу помітити.
mkko

1
зробіть, що mvn -o для швидшого виконання
Натан Бубна

2
Ви можете замінити це складне вираження sed простимgrep -e '^[[:digit:]]'
bpedman

2
Якщо ви використовуєте -o, як рекомендує @NathanBubna, тоді переведете Maven в режим "офлайн". Якщо у вас ще не завантажено плагін довідки Maven та залежні банки, збірка не вдасться. Від цього трохи згоріли, сподіваємось, що це допоможе комусь іншому.
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
Добре, дякую. Я думаю, що це найближче, я піду до чистого рішення. Будь-які ідеї, як я можу придушити вихідний сигнал і відфільтрувати ці [INFO]повідомлення? Я не знайшов комутатора Maven. Інакше я просто додаю сценарій командного рядка для розбору номера версії.
mkko

80
Я видаляю всі журнали (INFO, ПОПЕРЕДЖЕННЯ тощо) та повідомлення "Завантажити" зmvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Чадвік

13
не очікував би нічого менш багатослівного від Мейвен
Енді,

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)

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}'.
James H.

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. Здається, вони трохи зафіксували комутатор -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комутатором.
gucce

1
@gucce Я можу підтвердити, що використовувана версія maven впливає на це: при 3.5.2 (версія пакета на debian 9) вихід з -q -DforceStdoutпорожнім був, навіть забезпечуючи версію 3.1.0 плагіна, використовувану з pluginManagement); Я налаштував Maven обгортку з версією 3.5.4 Maven, і вона працювала правильно
Gorkk

3
Нарешті, практичне рішення без гребування на 2019 рік - (це має стати прийнятою відповіддю). Працює і з CI-версіями - тестується 3.3.9, 3.5.3, 3.5.4, 3.6.0
Ed Randall

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

2
зробіть це mvn -o для швидшого виконання
Натан Бубна

1
Дивіться мою відповідь (швидкий перехід) нижче, де також фільтруються рядки "Завантажені:".
quickshiftin

10
Якщо ви використовуєте -o, як рекомендує @NathanBubna, тоді переведете Maven в режим "офлайн". Якщо у вас ще не завантажено плагін довідки Maven та залежні банки, збірка не вдасться. Від цього трохи згоріли, сподіваємось, що це допоможе комусь іншому.
phillipuniverse

Ви можете також додати, 2> /dev/nullоскільки в іншому випадку ви можете отриматиPicked up _JAVA_OPTIONS:
Якуб Боченський

2
У Windows замініть кінець команди на | findstr /v "[".
Тунакі

39

Верхня відповідь - це досить сміття, на мою думку, ви повинні використовувати купу грепа, щоб зламати вихід консолі Maven. Чому б не скористатися правильним інструментом для роботи? Використання синтаксису xpath є найкращим підходом до отримання номера версії, оскільки це призначений метод доступу до структури даних XML. Вираз, поданий нижче, обходить пом за допомогою "локальної назви" елементів, іншими словами ігноруючи декларації простору імен, які можуть бути, а можуть і не бути в xml.

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

@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

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як він відповідає на це, значно покращить його довгострокове значення. Будь ласка , змініть свій відповідь , щоб додати деякі пояснення.
Toby Speight

1
Я думаю, що для цього підходу потрібно поставити "-q" після mvn.
Радж

Це краще, ніж прийняте рішення; немає необхідності відфільтрувати шумний вихід.
Вілліан Міцуда

19

Це найчистіше рішення, яке я знайшов:

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

Переваги:

  • Це добре працює на всіх операційних системах і всіх оболонках.
  • Не потрібно ніяких зовнішніх інструментів!

Примітка:

  • maven-help-pluginверсія 3.2.0(і вище) має forceStdoutопцію. Ви можете замінити 3.2.0вищевказану команду на більш нову версію зі списку доступних версій mvn-help-плагіна з артефактора, якщо він є.
  • Опція -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), яке добре працює для мене. ( EDIT : див . Відповідь rjrjr для набагато простішого рішення без будь-яких тимчасових проблем з файлами)

Я використовую плагін Exec Maven разом із 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}' - нерекурсивний org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec
rjrjr

rjrjr: Чудово! Єдине, що мені потрібно тут зазначити, це обробка помилок: Якщо mvn не працює, ви отримуєте недійсну рядок версії. Тому потрібна певна перевірка, як-от перевірка mvn-коду повернення або самого рядка.
Том

6

Тільки для запису можна налаштувати журнал Maven's Simple SLF4J безпосередньо в командному рядку, щоб виводити лише те, що нам потрібно, налаштовуючи:

  • 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')

EDIT

Не на 100% впевнений, чому, але, виконуючи це за допомогою сценарію після збирання в Дженкінсі, результат вийшов [INFO]version, наприклад, наприклад [INFO]0.3.2.

Я скинув вихід у файл і провів його через мій перший фільтр безпосередньо з BASH, він працює чудово .., тож знову не знаю, що відбувається в землі Дженкінса.

Щоб отримати його на 100% у Дженкінсі, я додав 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')

EDIT

Останнє зауваження тут .. Я дізнався, 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=''

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.

Якщо ви хочете побачити приклад випуску кандидата, який використовується як частина життєвого циклу Maven, подивіться на pom.xmlмій інший проект з відкритим кодом - Build Monitor для Дженкінса .


5

Існує також один варіант без необхідності Maven:

grep -oPm1 "(?<=<version>)[^<]+" "pom.xml"

Це показує лише перше виникнення у пом. У моєму випадку спочатку виникнення батьківської версії пом. Але якщо чесно, це відповідь, яку я шукав. Це набагато швидше, ніж рішення, згадані раніше, і їх легко змінити, щоб отримати належне виникнення. Для того, щоб скористатись другою подією: grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pЩоб скористатися третьою подією на використання: grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3pі так далі
Krzysztof Cieśliński

Ви припускаєте, що елемент версії є першим явищем, і він не працює, коли припущення недійсне.
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

Це, безумовно, найпростіший розріз та наклеювання розчину:

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

це перегукується

1.4

2

Я знайшов для мене правильний баланс. Після mvn packageMaven-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

Це працювало для мене в режимі офлайн і без залежності 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

Мені потрібна саме ця вимога під час моєї роботи в Тревісі, але з кількома значеннями. Я починаю з цього рішення, але при виклику декількох разів це дуже повільно (мені потрібно 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 ...

котячий пом.xml | греп "" | голова -n 1 | sed -e "s / версія // g" | sed -e "s / \ s * [<> /] * // g"

Ви можете приховати цей рядок у сценарії оболонки або як псевдонім.


-1

це редакція зверху

котячий пом.xml | греп "" | голова -n 1 | sed -e "s / версія // g" | sed -e "s / \ s * [<> /] * // g"

Я перевірив це на cmdline працює добре

grep "" pom.xml | голова -n 1 | sed -e "s / версія // 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з вихідного сигналу.


-2
VERSION=$(head -50 pom.xml | awk -F'>' '/SNAPSHOT/ {print $2}' | awk -F'<' '{print $1}')

Це те, що я використовував для отримання номера версії, думав, що це буде кращий спосіб зробити це

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.