使用maven生成包含所有依赖项的xml文件

我需要为JBoss7生成module.xml文件,用于maven项目,该项目有很多jar依赖项。 最简单的方法是什么? 该文件看起来像:

     ...   

这样就可以为每个项目jar依赖项创建元素。

或者也许我做错了什么? 从maven项目创建JBoss7模块的正确方法是什么?

我真的不知道JBoss以及是否有另一种方法可以做到这一点,但你可以用GMaven做到这一点:

  org.codehaus.gmaven gmaven-plugin 1.3   def sw = new StringWriter() def xml = new groovy.xml.MarkupBuilder(sw) xml.module(xmlns:'urn:jboss:module:1.0', name:'ats.platform') { resources { project.runtimeClasspathElements.each { def path = it.find(".*?([\\w\\.-]*\\.jar)") { it[1] } !path?:'resource-root'(path:path) } } } println sw    

有几点需要注意:

  1. 该脚本将XML吐出到stdout,但您显然可以将其写入文件或其他任何内容。
  2. runtimeClasspathElements包含jar的绝对路径,这就是我用正则表达式解析它的原因。 您可以调整正则表达式以包含更多路径,或者只是在需要的不仅仅是jar文件名时添加字符串。

我在github上发布了一个工作示例 (它只是一个POM),我将上面的插件配置绑定到初始化构建阶段。 如果你有git,你可以自己克隆并运行它:

 git clone git://github.com/zzantozz/testbed tmp cd tmp mvn -q initialize -pl stackoverflow/7755255-gmaven-to-build-xml-from-classpath 

在示例项目中,我添加了jdom 1.0和dom4j 1.6.1作为依赖项,这里是它创建的输出:

         

注意:我不是一个时髦的专家,所以可能有一种更加时髦的方法,但你可以看到它是多么容易。

你可以试试smartics-jboss-modules-maven-plugin

它提供了非常强大的依赖控制:

  • 项目组的排除和包含(也包括通配符),
  • deps到其他JBoss模块的定义,
  • 传递依赖性处理
  • 还有更多

使用适当的描述符,生成的模块可以“按原样”复制到JBoss 7。

示例jboss-modules / foo.bar.foo-module.xml:

      foo.*   org.*    org.slf4j.slf4j-api         

还要在smartic插件配置中将excludeDependencyManagementDependenciesInPomProject设置为true,以避免包含50 MB的deps 🙂

这可以通过几个步骤轻松解决。

  1. 在你的shell中运行mvn dependency:list -DoutputFile=dep.list -DoutputAbsoluteArtifactFilename=true

    你会收到这样的文件:

     以下文件已解决:
         ch.qos.logback:logback-classic:jar:0.9.30:test:C:\ Dokumente und Einstellungen \ michael-o.m2 \ repository \ ch \ qos \ logback \ logback-classic \ 0.9.30 \ logback-classic -0.9.30.jar
         ch.qos.logback:logback-core:jar:0.9.30:test:C:\ Dokumente und Einstellungen \ michael-o.m2 \ repository \ ch \ qos \ logback \ logback-core \ 0.9.30 \ logback-core -0.9.30.jar
         classworlds:classworlds:jar:1.1-alpha-2:compile:C:\ Dokumente und Einstellungen \ michael-o.m2 \ repository \ classworlds \ classworlds \ 1.1-alpha-2 \ classworlds-1.1-alpha-2.jar
    

    重要信息在文件中缩进4个空格。

  2. 现在grep out重要信息,不要忘记限制编译和运行时范围。

  3. 使用cut -d ':' -f 拆分列并获取最后一列。
  4. 在最后一个(后退)斜杠后获取文件名。
  5. 现在用这些信息构建一个XML文件。

每个都可以打包在一个漂亮的shell脚本中。

请参阅maven-dependency-plugin以供参考。

快速命令如下所示: cat dep.list | grep -E ':(compile|runtime):' | cut -d ':' -f 7 | sed -e 's/\///g' | xargs -I {} basename '{}' | xargs -I {} echo "" cat dep.list | grep -E ':(compile|runtime):' | cut -d ':' -f 7 | sed -e 's/\///g' | xargs -I {} basename '{}' | xargs -I {} echo ""

输出包含jar文件名:

        

现在用XML页眉和页脚包装,你就完成了!

虽然这个问题很老,而且已经有了一个有效的答案,但我想提一下另一个选择。

当我们开始使用JBoss模块时,我们为Maven编写了一个小插件,它使用基于XML描述符的module.xmls生成模块文件夹。 该插件名为smartics-jboss-modules-maven-plugin ,您可以在项目的博客中找到有关它的更多信息。

我们刚开始使用它,但它已经使我们项目的POM和module.xml(加上目录结构)之间的同步过程变得非常容易。

这种方法的缺点是你必须学习一个额外的XML描述符,并且必须配置一个额外的Maven插件。 因此,对于小型项目,您可能最好遵循上述答案的解决方案。

如果您想尝试一下,该插件将在Apache License 2.0下获得许可。