我想从命令行中检索 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+:)'`
答案 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
优势:
groupId
或version
是从父pom.xml
继承而来的,它也可以正常工作。
xmllint
的解决方案失败!echo
或grep
)或者,您可以在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:me
或mvn 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'.