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

Я хотел бы получить из командной строки идентификатор группы, идентификатор артефакта и версию проекта Maven.

Предлагаемое решение в этой теме " Как получить версию проекта Maven в командной строке bash " заключается в использовании следующего плагина:

mvn org.apache.maven.plugins:maven-help-plugin:2.2:evaluate -Dexpression=project.artifactId

Это хорошо работает, но я не могу понять, как в то же время установить project.groupId, project.artifactId & project.version к аргументу -Dexpression.

Я бы не стал запускать 3 раза команду Maven с другим аргументом -Dexpression каждый раз...

Thks


На данный момент я получаю данные, выполнив следующие действия:

local pom_groupid=`mvn org.apache.maven.plugins:maven-help-plugin:2.2:evaluate -Dexpression=project.groupId |grep -Ev '(^\[|Download\w+:)'`
local pom_artifactid=`mvn org.apache.maven.plugins:maven-help-plugin:2.2:evaluate -Dexpression=project.artifactId |grep -Ev '(^\[|Download\w+:)'`
local pom_version=`mvn org.apache.maven.plugins:maven-help-plugin:2.2:evaluate -Dexpression=project.version |grep -Ev '(^\[|Download\w+:)'`

9 ответов

Вот еще один подход, который не требует создания плагина Maven, хотя Оливье показал, что его довольно легко сделать.

mvn -q -Dexec.executable = echo -Dexec.args = '$ {project.groupId} $ {project.artifactId} $ {project.version}' --non-recursive exec: exec 2> / dev / null

Обратите внимание, что это с учетом среды Linux. В Windows вы, вероятно, могли бы создать командный файл, который печатает его ввод или что-то еще.

Одним из недостатков этого подхода является то, что вам, возможно, придется добавить | grep -v "something" до самого конца команды выше (после 2>/dev/null) отфильтровать некоторый текст, который печатает maven на стандартный вывод. В моем случае у меня была только одна строка текста для фильтрации, которая будет отображаться только в моей компании.

Кредит, где это обусловлено: я адаптировал эту информацию из этого другого потока Stackru.

Это самое чистое из имеющихся решений:

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

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

  • Это отлично работает во всех операционных системах (OS X, Ubuntu, Windows и т. Д.) И во всех оболочках (bash, zsh и т. Д.).
  • [очень важно] Это отлично работает, даже если groupId или version наследуется от родителя pom.xml.
    • Обратите внимание, что xmllintрешения на основе не работают, когда свойства POM наследуются
  • Нулевая зависимость от внешних инструментов! (обратите внимание, что я не используюecho или grep)

Заметка:

  • maven-help-plugin версия 3.2.0 (и выше) имеет forceStdoutвариант. Вы можете заменить3.2.0в приведенной выше команде с более новой версией из списка доступных версий mvn-help-plugin из artifactory, если таковая имеется.
  • Вариант -q подавляет подробные сообщения.

Кроме того, вы можете добавить эту запись в свой pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-help-plugin</artifactId>
    <version>3.2.0</version>
</plugin>

а затем компактно запустите команды следующим образом:

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

Более простая команда, полученная из ответа @Patrick для получения формата "GAV":

echo '${project.groupId}:${project.artifactId}:${project.version}' | mvn -N -q -DforceStdout help:evaluate

В случае оценки внешнего файла *.pom эта команда может быть полезна:

echo '${project.groupId}:${project.artifactId}:${project.version}' | mvn -N -q -DforceStdout help:evaluate -f <path-to-pom-file>

Вы можете указать несколько выражений для maven-help-plugin (так что вам нужно будет запустить его только один раз), а затем извлечь их из захваченного вывода, выполнив grep'ing для указанного вами "ключа":

output=$(printf 'LOCAL_REPOSITORY=${settings.localRepository}\nGROUP_ID=${project.groupId}\nARTIFACT_ID=${project.artifactId}\nPOM_VERSION=${project.version}\n0\n' | mvn help:evaluate)

localRepository=$(echo "$output" | grep '^LOCAL_REPOSITORY' | cut -d = -f 2)
groupId=$(echo "$output" | grep '^GROUP_ID' | cut -d = -f 2)
artifactId=$(echo "$output" | grep '^ARTIFACT_ID' | cut -d = -f 2)
pomVersion=$(echo "$output" | grep '^POM_VERSION' | cut -d = -f 2)

Другие решения, которые анализируют pom.xml, работают для простых случаев использования, однако они не работают, если вам нужен доступ к тому, что либо не определено в pom.xml (settings.localRepository) или потенциально полученное значение (project.version).

В bash рассмотрим следующие строки, которые я использую для их получения.
Он использует xmllint и некоторые манипуляции со строками.

GROUP_ID=`echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:groupId/text()' | xmllint --shell pom.xml | grep -v /`
ARTIFACT_ID=`echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:artifactId/text()' | xmllint --shell pom.xml | grep -v /`
VERSION=`echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:version/text()' | xmllint --shell pom.xml | grep -v /`

Надеюсь, это поможет.

У меня была проблема с эхом и интерактивным режимом false + настраиваемый профиль.. оказывается, вы можете указать все 3 (или 4, если вам нужна упаковка) в выражении , опуская первый ${ и последний } например:

      mvn -N -q -DforceStdout help:evaluate -Dexpression='project.groupId}:${project.artifactId}:${project.packaging}:${project.version' -f ./xpp3-1.1.3.4.O.pom

Или более элегантно (включая упаковку) с помощью project.id :

      -Dexpression=project.id

Это связано с тем, что исходный код оборачивает выражение:

      handleResponse( "${" + expression + "}", output );

Источник/кредиты:https://github.com/paul-hammant/maven-plugins/blob/master/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java

Ошибка , которую я получил при использовании интерактивного режима false и профиля с -P:

      [ERROR] Maven is configured to NOT interact with the user for input. This Mojo requires that 'interactiveMode' in your settings file is flag to 'true'.

Иногда мы забываем о том, как легко адаптировать Maven к нашим потребностям: вот очень простой пользовательский плагин, который делает одну вещь, объединяет groupId,artifactId и version и отправляет его в out.

Проверь это, беги mvn clean install (местный) или mvn clean deploy(хранилище), чтобы сделать его доступным в вашей среде.

Тогда беги mvn my.helper.maven.plugin:helper-maven-plugin:me или же mvn helper:me (после добавления <pluginGroup>my.helper.maven.plugin</pluginGroup> на ваш <pluginGroups> в вашем Maven settings.xml), чтобы на консоли отображалась следующая строка:

my.help.me={project.groupId}:{project.artifactId}:{project.version}

Чтобы отфильтровать все, кроме этой строки, все, что вам нужно сделать, это запустить:

mvn helper:me| grep ^my.help.me=

или даже проще:

mvn -q helper.me

Я предпочитаю избегать новых зависимостей, где я могу легко решить решение. Использование powershell:

[xml]$pomXml = Get-Content .\pom.xml

# version
Write-Host $pomXml.project.version

# groupId
Write-Host $pomXml.project.groupId

# artifactId
Write-Host $pomXml.project.artifactId

xmlstarlet удобен для извлечения данных XML и намного быстрее, чем maven. например:

      artifact="$(xmlstarlet sel -N my=http://maven.apache.org/POM/4.0.0 -t -m my:project -v my:artifactId pom.xml)"
Другие вопросы по тегам