【问题标题】:Generate an xml file with all dependencies with maven使用 maven 生成包含所有依赖项的 xml 文件
【发布时间】:2011-10-13 13:58:30
【问题描述】:

我需要为一个有很多 jar 依赖项的 maven 项目为 JBoss7 生成 module.xml 文件。最简单的方法是什么?该文件如下所示:

<module xmlns="urn:jboss:module:1.0" name="ats.platform">
  <resources>
    <resource-root path="dom4j-1.6.1.jar"/>
    <resource-root path="jdom-1.0.jar"/>
...
  </resources>
</module>

以便为每个项目的 jar 依赖项创建 &lt;resource-root&gt; 元素。

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

【问题讨论】:

  • 我做了一个程序,可以从项目类路径中删除不需要的(未使用的)jar。你在找这样的东西吗?
  • 不,我需要从现有的 maven 项目构建一个 jboss-module。但有趣的是,“删除”和“不需要”是什么意思?据我了解,您可以在 pom 文件中管理&lt;dependencies&gt;。该程序到底是做什么的?
  • 一般我们都是把你所有的jar包都加进去,然后一个一个去掉,检查依赖关系。但相反,我创建了一个程序,它将读取你最初映射的所有 jars。然后我会找到不依赖于当前项目或当前项目中任何相关类的那些。我给出了想要的 jars 和不需要的 jars 以及你的项目工作所需的一个 jars 的输出。
  • 通常我会保持依赖关系是最新的,所以列出的所有内容都是必需的。此外,一些依赖关系可能是隐含的,例如API 实现(xerces 或 ws)或 jdbc-drivers。

标签: java maven jboss7.x


【解决方案1】:

我真的不知道 JBoss 以及是否有其他方法可以做到这一点,但您可以使用 GMaven 非常简单地做到这一点:

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.3</version>
    <configuration>
        <source>
            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
        </source>
    </configuration>
</plugin>

有几点需要注意:

  1. 该脚本将 XML 输出到标准输出,但您显然可以非常轻松地将其写入文件或其他任何内容。
  2. runtimeClasspathElements 包含 jar 的绝对路径,这就是我使用正则表达式解析它的原因。您可以调整正则表达式以包含更多路径,或者如果您需要的不仅仅是 jar 文件名,则只需在前面添加一个字符串。

我已经发布了一个working example on 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 作为依赖项,这是它创建的输出:

<module xmlns='urn:jboss:module:1.0' name='ats.platform'>
  <resources>
    <resource-root path='jdom-1.0.jar' />
    <resource-root path='dom4j-1.6.1.jar' />
    <resource-root path='xml-apis-1.0.b2.jar' />
    <resource-root path='aspectjrt-1.6.11.jar' />
  </resources>
</module>

注意:我不是 groovy 专家,所以可能有一种更流行的方法来做到这一点,但你可以看到它是多么容易。

【讨论】:

  • 在哪里可以找到 gmaven 的文档?谷歌显示了一些陈旧的链接......例如对诸如“runtimeClasspathElements”之类的事物的描述在哪里?
  • Google 链接没有过期。阅读页面并点击链接。 GMaven 有一个wiki at Codehaus,里面有很多必需品。不幸的是,文档有点简单,但是使用 Groovy,通常很容易找到自己的方式。
  • 我找不到这些东西的任何信息。例如。 runtimeClasspathElements 这里没有描述。还是我看错了方向? docs.codehaus.org/… 什么也没给。我毫不怀疑它应该是提取文件名和工件包装类型而不是使用正则表达式魔法的更合适的方法。此外,还不清楚它们属于哪个依赖范围 - 编译、运行时、测试等。
  • 是的,方向错误。 projectthe MavenProject--Maven API 的一部分,与 GMaven 无关。您需要了解的有关 Maven 的所有信息都在 its project page 上。 Javadoc 位于 Maven 项目的典型位置。还有a blog post that mentions it。此外,我认为 runtimeClasspathElements 对其范围非常明确。
  • 哦,你总是可以在运行时自省:project.getMetaPropertyValues().each { println it.name + ": " + it.value },使用Groovy Object extension。在this bloggroovy.inspect packageGroovy Reflection 中了解更多信息。
【解决方案2】:

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

它提供了相当强大的依赖控制:

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

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

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

<modules xmlns="http://smartics.de/ns/jboss-modules-descriptor/1">
<module name="foo.bar.foo-module">
    <match>
        <includes>
            <include>
                <groupId>foo.*</groupId>
            </include>
            <include>
                <groupId>org.*</groupId>
            </include>
        </includes>
        <excludes>
            <exclude>org.slf4j.slf4j-api</exclude>
        </excludes>
    </match>

    <apply-to-module>
        <dependencies>
            <module name="org.slf4j" />
        </dependencies>
    </apply-to-module>
</module>

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

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 感谢您的反馈,马库斯。
【解决方案3】:

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

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

    您将收到如下文件:

    The following files have been resolved:
        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 出重要信息,不要忘记限制编译和运行时范围。

  3. cut -d ':' -f &lt;colNum&gt; 拆分列并获取最后一列。
  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 "&lt;resource-root path=\"{}\" /&gt;"

输出包含 jar 文件名:

<resource-root path="classworlds-1.1-alpha-2.jar" />
<resource-root path="jsr305-1.3.9.jar" />
<resource-root path="guava-10.0.1.jar" />
<resource-root path="commons-codec-1.3.jar" />
<resource-root path="commons-io-2.0.1.jar" />
<resource-root path="commons-lang-2.6.jar" />
<resource-root path="junit-4.9.jar" />

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

【讨论】:

  • 取决于平台。 Windows 没有 grep、sed 等。我认为使用 maven-antrun-plugin 应该是可能的,但不是很了解(我希望标准的 ant 不足以完成任务)。作为最后的手段 - 我可以为它制作一个新的 maven 插件。
  • 是的。当然它可以用 antrun 完成,但比我的单个 unix cmd 行要多得多。显然你无法避免编码。
【解决方案4】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 2014-06-08
    • 2017-07-29
    • 2018-11-16
    • 1970-01-01
    • 2016-10-13
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多