如何获取Maven groupId、artifactId和;将版本投影到命令行

如何获取Maven groupId、artifactId和;将版本投影到命令行,maven,command-line,Maven,Command Line,我想从命令行检索groupId、artifactId和Maven项目的版本 本主题“”中建议的解决方案是使用以下插件: mvn org.apache.maven.plugins:maven帮助插件:2.2:evaluate-Dexpression=project.artifactId 它工作得很好,但我不知道如何同时将project.groupId、project.artifactId和project.version设置为-Dexpression参数 我会避免每次使用不同的-Dexpressio

我想从命令行检索groupId、artifactId和Maven项目的版本

本主题“”中建议的解决方案是使用以下插件:

mvn org.apache.maven.plugins:maven帮助插件: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+:)'`

在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 /`

我希望这能有所帮助。

有时候,我们忘记了根据我们的需要定制Maven是多么容易:只需做一件事,将groupId、artifactId和version连接起来并发送出去

签出它,运行
mvn clean install
(本地)或
mvn clean deploy
(存储库),使其在您的环境中可用

然后运行
mvn my.helper.maven.plugin:helper maven plugin:me
mvn helper:me
(在将
my.helper.maven.plugin
添加到maven settings.xml中的
中后)在控制台上显示以下行:

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

要过滤掉除此行以外的所有内容,您只需运行:

mvn helper:me| grep ^my.help.me=
或者更简单:

mvn -q helper.me

这里有另一种方法,它不需要创建Maven插件,尽管Olivier已经证明创建插件非常容易

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

请注意,这是根据linux环境定制的。在windows上,您可能会创建一个批处理文件来打印其输入或其他内容

这种方法的一个缺点是,您可能必须将
|grep-v“something”
添加到上述命令的末尾(在
2>/dev/null
之后),以过滤掉maven打印到stdout的一些文本。在我的例子中,我只有一行要过滤的文本,它们只会出现在我的公司


值得称赞的地方:我从中改编了此信息。

我更喜欢避免新的依赖项,这样我可以轻松解决问题。使用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

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

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)

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

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

mvn org.apache.maven.plugins:maven帮助plugin:3.2.0:evaluate\
-Dexpression=project.groupId-q-DforceStdout
插件:maven帮助插件:3.2.0:evaluate\
-Dexpression=project.artifactId-q-DforceStdout
插件:maven帮助插件:3.2.0:evaluate\
-Dexpression=project.version-q-DforceStdout
优点:

  • 这在all操作系统(OSX、Ubuntu、Windows等)和allshell(bash、zsh等)上都能正常工作
  • [非常重要]即使
    groupId
    version
    是从父
    pom.xml
    继承的,这也可以正常工作。
    • 请注意,当POM属性被继承时,基于
      xmllint
      的解决方案会失败
  • 零依赖外部工具!(注意,我没有使用任何
    echo
    grep
或者,您可以将此条目添加到
pom.xml
中的
插件
部分:


org.apache.maven.plugins
来自artifactory(如果可用)
  • 选项
    -q
    抑制冗长消息

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

    对于要评估的外部*.pom文件,此命令可能有用:

    echo '${project.groupId}:${project.artifactId}:${project.version}' | mvn -N -q -DforceStdout help:evaluate -f <path-to-pom-file>
    
    echo'${project.groupId}:${project.artifactId}:${project.version}'| mvn-N-q-DforceStdout帮助:evaluate-f
    
    我遇到了echo和interactiveMode 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
    
    一个或多个带有项目id的优雅的(包括包装):

    -Dexpression=project.id
    
    这是因为源代码包装了表达式:

    handleResponse( "${" + expression + "}", output );
    
    资料来源/学分:

    使用interactiveMode时出现的错误以及带有-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'.
    

    目前,我做的事情和你差不多,但仍然有三个不同的电话…不过,这是快速和简单的。不要过度设计:-)如果版本是从父级继承的,这可能不起作用。感谢您的插件,它工作得很好。但不幸的是,无法使用“定制”插件(settings.xml)升级环境,并且构建的pom也是只读的。目前,我必须为此脚本使用通用/默认工具。。。KRAs只要你有办法在maven repo中推送插件,使用“long”命令应该可以工作,而不需要修改settings.xml或pom.xml。但我明白有时候“不”意味着“不”注意,这只适用于对这些字段使用文字值的POM,而不是插值。这种方法的一个缺点是所有依赖项都需要重新定义
    [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'.