如何获得Maven groupId,artifactId&项目版本到命令行

时间:2014-05-07 15:22:24

标签: maven command-line

我想从命令行中检索 groupId,artifactId& Maven项目的版本

本主题中提出的解决方案" How to get Maven project version to the bash command line"是使用以下插件:

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+:)'`

8 个答案:

答案 0 :(得分:10)

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

  

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

请注意,这是针对linux环境量身定制的。在Windows上,您可以创建一个打印输入或其他内容的批处理文件。

这种方法的一个缺点是你可能必须在上面命令的最后(| grep -v "something"之后)添加2>/dev/null以过滤掉maven打印到stdout的一些文本。在我的情况下,我只有一行文字来过滤,只会出现在我的公司。

归功于它:我从this other StackOverflow thread改编了这些信息。

答案 1 :(得分:5)

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

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等)和所有 shell(bash,zsh等)上都可以正常运行
  • [非常重要]即使groupIdversion是从父pom.xml继承而来的,它也可以正常工作。
    • 请注意,当继承POM属性时,基于xmllint的解决方案失败
  • 对外部工具的零依赖性! (请注意,我使用任何echogrep

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

<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

请注意:

  • maven-help-plugin版本3.2.0(及更高版本)具有forceStdout选项。您可以用人工制品中available versions of mvn-help-plugin列表中的较新版本替换上述命令中的3.2.0
  • 选项-q禁止显示详细消息。

答案 2 :(得分:4)

有时,我们忘记了根据我们的需要定制Maven是多么容易:here is a very simple custom plugin做一件事,连接groupId,artifactId和版本并将其发送出去。

检查一下,运行mvn clean install(本地)或mvn clean deploy(存储库),使其在您的环境中可用。

然后运行mvn my.helper.maven.plugin:helper-maven-plugin:memvn helper:me(将<pluginGroup>my.helper.maven.plugin</pluginGroup>添加到Maven settings.xml中的<pluginGroups>后)以在控制台上显示以下行:

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

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

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

甚至更简单:

mvn -q helper.me

答案 3 :(得分:4)

你可以为maven-help-plugin指定多个表达式(所以你只需要运行一次),然后通过grep'ing为你指定的'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)。

答案 4 :(得分:3)

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

我希望这会有所帮助。

答案 5 :(得分:3)

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

答案 6 :(得分:3)

从@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>

答案 7 :(得分:0)

我在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

或更优雅(包括包装),并带有 project.id

-Dexpression=project.id

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

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

来源/学分: conditional write

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'.