如何在命令行中获取Maven groupId、artifactId和项目版本

u5i3ibmn  于 2023-10-17  发布在  Maven
关注(0)|答案(9)|浏览(133)

我想从命令行中检索Maven项目的 *groupId、artifactId和版本 *。
本主题“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命令.
谢谢
目前,我通过执行以下操作来检索数据:

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

bvjveswy1#

我更喜欢避免新的依赖关系,这样我可以很容易地解决问题。使用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
qgzx9mmu

qgzx9mmu2#

xmlstarlet对于XML数据提取很方便,而且比maven快得多。例如:

artifact="$(xmlstarlet sel -N my=http://maven.apache.org/POM/4.0.0 -t -m my:project -v my:artifactId pom.xml)"
xhv8bpkk

xhv8bpkk3#

这里有另一种方法,它不需要创建一个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打印到标准输出的一些文本。在我的情况下,我只有一行文本要过滤,这只会出现在我的公司。
到期的信贷:我从this other StackOverflow thread中改编了这个信息。

k2fxgqgv

k2fxgqgv4#

这是可用的最清洁的解决方案

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>

然后运行compute命令如下:

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选项。你可以用artifactory的available versions of mvn-help-plugin列表中的新版本替换上面命令中的3.2.0,如果可用的话。
  • 选项-q抑制详细消息。
knpiaxh1

knpiaxh15#

一个更简单的命令,来自@帕特里克的答案,以获得“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>
k0pti3hp

k0pti3hp6#

在bash中,考虑我用来获取它们的以下行。
它使用xmlint和一些字符串操作。

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

我希望这能帮上忙。

nwo49xxi

nwo49xxi7#

您可以为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),则它们就不起作用了。

vof42yt1

vof42yt18#

我有一个问题,回声和interactiveMode假+自定义配置文件。原来你可以在表达式中指定所有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

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

-Dexpression=project.id

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

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

来源/ Credits:https://github.com/paul-hammant/maven-plugins/blob/master/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java
当使用interactiveMode* falseprofile与-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'.
polkgigr

polkgigr9#

有时候,我们忘记了根据我们的需求定制Maven是多么容易:here is a very simple custom plugin只做一件事,连接groupId,artifactId和version并将其发送给out。
检查它,运行mvn clean install(本地)或mvn clean deploy(存储库),使其在您的环境中可用。
然后运行mvn my.helper.maven.plugin:helper-maven-plugin:memvn helper:me(在Maven settings.xml中将<pluginGroup>my.helper.maven.plugin</pluginGroup>添加到<pluginGroups>之后),以在控制台上显示以下行:
my.help.me={project.groupId}:{project.artifactId}:{project.version}
要过滤掉除这一行以外的所有内容,您只需运行以下命令:

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

或者更简单:

mvn -q helper.me

相关问题