【问题标题】:How to get Maven groupId, artifactId & project version to the command line如何获取 Maven groupId、artifactId 和项目版本到命令行
【发布时间】:2014-06-24 16:07:22
【问题描述】:

我想从命令行检索 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+:)'`

【问题讨论】:

    标签: maven command-line


    【解决方案1】:

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

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

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

    这种方法的一个缺点是您可能必须将| grep -v "something" 添加到上述命令的最后(2>/dev/null 之后)以过滤掉一些 maven 打印到标准输出的文本。就我而言,我只有一行要过滤的文本,它只会出现在我的公司。

    应得的信用:我从this other StackOverflow thread改编了此信息。

    【讨论】:

    • 这种方法的一个缺点是在提取属性之前需要解决所有依赖关系。存在您不想解决依赖关系而只想在 pom 文件中声明的属性的情况。在这种情况下,help:evaluate 仍然是更好的选择。
    • 嗨!我对此很陌生。您是如何使用此命令指定插件的?是这样的吗? org.codehaus.mojoexec-maven-plugin3.0.0我应该在里面放什么执行?
    【解决方案2】:

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

    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.xmlplugins 部分下添加此条目:

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

    【讨论】:

      【解决方案3】:

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

      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) 中未定义的内容或可能派生的值 (@987654323 @)。

      【讨论】:

      • 谢谢,这很好用!我添加了选项-q -DforceStdout 以避免一些混乱。
      【解决方案4】:

      在 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】:

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

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

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

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

      要过滤除此行之外的所有内容,您所要做的就是运行:

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

      甚至更简单:

      mvn -q helper.me
      

      【讨论】:

      • 感谢您的插件,它运行良好。但不幸的是,无法使用“自定义”插件(settings.xml)升级环境,并且 构建的 pom 也是只读的。目前我必须为此脚本使用通用/默认工具... KR
      • 只要你有办法将插件推送到你的 maven repo 中,使用“long”命令应该可以工作,而不需要修改 settings.xml 或 pom.xml。但我明白有时,“不”意味着“不”;)
      【解决方案6】:

      一个更简单的命令,源自@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>
      

      【讨论】:

      • 获取不同的属性并将它们分配给shell变量:IFS=: read id version &lt;&lt;&lt; "$(echo '${project.artifactId}:${project.version}' | mvn --quiet --non-recursive help:evaluate -DforceStdout)"
      • @GJ。感谢 IFS + 阅读建议。
      【解决方案7】:

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

      【讨论】:

      • 请注意,这仅适用于使用这些字段的文字值的 POM,而不是插值。
      【解决方案8】:

      我遇到了 echo 和 interactiveMode false + 自定义配置文件的问题。事实证明,您可以在 表达式 中指定 all 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 );
      

      来源/学分: https://github.com/paul-hammant/maven-plugins/blob/master/maven-help-plugin/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java

      我在使用 interactiveMode false 和带有 -P 的 profile 时遇到的错误

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

      【讨论】:

      • 不幸的是,project.id 返回 groupId:artifactId:packaging:version。例如,dependency:copy 目标需要 groupId:artifactId:version[:packaging[:classifier]]。
      猜你喜欢
      • 2020-03-11
      • 2011-04-02
      • 1970-01-01
      • 2013-08-30
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多