Как получить 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)"