如何获取Maven groupId、artifactId和;将版本投影到命令行
我想从命令行检索groupId、artifactId和Maven项目的版本 本主题“”中建议的解决方案是使用以下插件:如何获取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
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
- 请注意,当POM属性被继承时,基于
- 零依赖外部工具!(注意,我没有使用任何
或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'.