2013-04-08 129 views
3

我需要从大量的pom.xml文件中提取Maven GAV(groupId,artifactId,版本)。并非所有的POM都有一个父POM声明,因此需要考虑父GAV和项目GAV之间的继承关系。如何从shell脚本中的pom.xml文件中提取GAV

我只想使用可以在Linux shell中轻松编写脚本的工具,例如庆典。

回答

1
grep -v '\[' <(mvn help:evaluate -Dexpression="project.groupId" 2>/dev/null && 
    mvn help:evaluate -Dexpression="project.artifactId" 2>/dev/null && 
    mvn help:evaluate -Dexpression="project.version" 2>/dev/null) 
+2

虽然这个代码片断可以解决的问题,[包括解释(http://meta.stackexchange.com/questions/114762/explain-completely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – DimaSan 2017-03-18 01:37:14

+0

真的吗?!两个赞同批评,并不是单一的解决它的单一线索。 – ingyhere 2017-03-20 18:17:25

+0

这不是一个批评,只是一个建议,使您的单行解算器对未来的SO用户更有用和有价值。 – DimaSan 2017-03-20 18:19:45

5

我能找到的最佳解决方案是使用XSL转换。使用以下内容创建一个文件extract-gav.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:pom="http://maven.apache.org/POM/4.0.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/pom:project"> 
     <!-- this XML element just serves as a bracket and may be omitted --> 
     <xsl:element name="artifact"> 
      <xsl:text>&#10;</xsl:text> 

      <!-- process coordinates declared at project and project/parent --> 
      <xsl:apply-templates select="pom:groupId|pom:parent/pom:groupId" mode="copy-coordinate"/> 
      <xsl:apply-templates select="pom:artifactId|pom:parent/pom:artifactId" mode="copy-coordinate"/> 
      <xsl:apply-templates select="pom:version|pom:parent/pom:version" mode="copy-coordinate"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*" mode="copy-coordinate"> 
     <!-- omit parent coordinate if same coordinate is explicitly specified on project level --> 
     <xsl:if test="not(../../*[name(.)=name(current())])"> 

      <!-- write coordinate as XML element without namespace declarations --> 
      <xsl:element name="{local-name()}"> 
       <xsl:value-of select="."/> 
      </xsl:element> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

这种变换然后可以在外壳与第命令xsltproc extract-gav.xsl pom.xml

这将产生输出在被调用的(假定已安装了的libxslt)格式如下:

<artifact> 
    <groupId>org.example.group</groupId> 
    <artifactId>example-artifact</artifactId> 
    <version>1.2.0</version> 
</artifact> 

如果你需要一个不同的格式,XSL转换应该很容易适应,这样它适合你的ñ电火工品。例如。以下改造写入GAV为制表符分隔的纯文本:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:pom="http://maven.apache.org/POM/4.0.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/pom:project"> 
     <!-- process coordinates declared at project and project/parent --> 
     <xsl:apply-templates select="pom:groupId|pom:parent/pom:groupId" mode="copy-coordinate"/> 
     <xsl:apply-templates select="pom:artifactId|pom:parent/pom:artifactId" mode="copy-coordinate"/> 
     <xsl:apply-templates select="pom:version|pom:parent/pom:version" mode="copy-coordinate"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

    <xsl:template match="*" mode="copy-coordinate"> 
     <xsl:if test="not(../../*[name(.)=name(current())])"> 
      <xsl:value-of select="."/> 
      <xsl:text>&#9;</xsl:text> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
0

我使用了一个名为POM Groovy脚本,我放在PATH。它看起来像这样:

#!/usr/bin/env groovy 

def cli = new CliBuilder(usage:'pom') 
cli.h('print usage') 
cli.n('do not auto-print output') 
cli.p(args:1, argName:'pom', 'the POM file to use') 

def options = cli.parse(args) 
def arguments = options.arguments() 

if (options.h || arguments.size() == 0) { 
    println cli.usage() 
} else { 
    def fileName = options.p ? options.p : "pom.xml" 
    def script = arguments[0] 

    def output = Eval.x(new XmlSlurper().parse(new File(fileName)), "x.${script}") 
    if (!options.n) println output 
} 

现在,你可以提取这样的价值观:

pom version 
pom groupId 
pom 'properties."project.build.sourceEncoding"' 
pom -n 'modules.module.each { println it }' 
pom -n 'dependencyManagement.dependencies.dependency.each { \ 
    println "${it.groupId}:${it.artifactId}:${it.version}" \ 
}' 
相关问题