如何将Maven groupId,artifactId和项目版本添加到命令行

gud*_*ier 13 command-line 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说法.

我会避免每次使用不同的-Dexpression参数启动3次Maven命令...

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+:)'`
Run Code Online (Sandbox Code Playgroud)

小智 14

这是另一种不需要创建Maven插件的方法,尽管Olivier已经证明它很容易制作.

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打印到stdout的一些文本.在我的情况下,我只有一行文字来过滤,只会出现在我的公司.

信用到期:我从其他StackOverflow线程调整了此信息.


Man*_*ath 10

这是可用的最干净的解决方案

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
Run Code Online (Sandbox Code Playgroud)

好处:

  • 这适用于所有操作系统(OS X、Ubuntu、Windows 等)和所有shell(bash、zsh 等)
  • [非常重要] 即使groupIdversion是从 parent 继承的,pom.xml
    • 请注意,当继承 POM 属性时,xmllint基于 -based 的解决方案会失败
  • 零依赖外部工具!(请注意,我没有使用任何echogrep

或者,您可以在您的pom.xml,plugins部分下添加此条目:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-help-plugin</artifactId>
    <version>3.2.0</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)

然后按如下方式紧凑地运行命令:

mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout
mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Run Code Online (Sandbox Code Playgroud)

请注意:

  • maven-help-plugin版本3.2.0(及更高版本)有forceStdout选项。如果可用,您可以使用来自 artifactory的 mvn-help-plugin3.2.0可用版本列表中的更新版本替换上述命令。
  • 选项-q抑制详细消息。

  • 在 Powershell 上对我不起作用。我必须将表达式用单引号括起来 `-Dexpression='project.groupId'` (2认同)

小智 9

一个更简单的命令,源自 @Patrick's 答案以获得“GAV”格式:

echo '${project.groupId}:${project.artifactId}:${project.version}' | mvn -N -q -DforceStdout help:evaluate
Run Code Online (Sandbox Code Playgroud)

如果要评估外部 *.pom 文件,此命令可能有用:

echo '${project.groupId}:${project.artifactId}:${project.version}' | mvn -N -q -DforceStdout help:evaluate -f <path-to-pom-file>
Run Code Online (Sandbox Code Playgroud)

  • 要获取不同的属性并将它们分配给 shell 变量: `IFS=: read id version &lt;&lt;&lt; "$(echo '${project.artifactId}:${project.version}' | mvn --quiet --non-recursive帮助:评估-DforceStdout)"` (2认同)

Pat*_*ker 6

您可以为 maven-help-plugin 指定多个表达式(因此您只需运行一次),然后通过对您指定的“key”进行 grep'ing 从捕获的输出中提取它们:

output=$(printf \
    'LOCAL_REPOSITORY=${settings.localRepository}\n'\
    'GROUP_ID=${project.groupId}\n'
    'ARTIFACT_ID=${project.artifactId}\n'\
    'POM_VERSION=${project.version}\n0\n' \
  | mvn help:evaluate --non-recursive )

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)
Run Code Online (Sandbox Code Playgroud)

解析 pom.xml 的其他解决方案适用于简单的用例,但是如果您需要访问未在 pom.xml ( settings.localRepository) 中定义或潜在派生值 ( project.version) 中定义的内容,则它们会失效。


Eld*_*sis 5

In bash, consider the following lines I use to get them.
It uses xmllint and some string manipulation.

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 /`
Run Code Online (Sandbox Code Playgroud)

I hope this helps.


Mig*_*ira 5

我遇到了 echo 和 InteractiveMode false + 自定义配置文件的问题。事实证明,您可以通过省略第一个${和最后一个${ 来指定表达式中的所有 3 个(或 4 个,如果您需要打包)} ex

mvn -N -q -DforceStdout help:evaluate -Dexpression='project.groupId}:${project.artifactId}:${project.packaging}:${project.version' -f ./xpp3-1.1.3.4.O.pom
Run Code Online (Sandbox Code Playgroud)

或者更优雅地(这将包括打包)使用project.id

-Dexpression=project.id
Run Code Online (Sandbox Code Playgroud)

这是因为源代码包装了表达式:

handleResponse( "${" + expression + "}", output );
Run Code Online (Sandbox Code Playgroud)

来源/学分: https://github.com/paul-hammant/maven-plugins/blob/master/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java

使用InteractiveMode 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'.
Run Code Online (Sandbox Code Playgroud)