10

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

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

以便<resource-root>为每个项目 jar 依赖项创建元素。

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

4

4 回答 4

4

我真的不知道 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. 包含 jar的runtimeClasspathElements绝对路径,这就是我用正则表达式解析它的原因。您可以调整正则表达式以包含更多路径,或者如果您需要的不仅仅是 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 作为依赖项,这是它创建的输出:

<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 专家,所以可能有一种更时髦的方法来做到这一点,但你可以看到它是多么容易。

于 2011-10-16T18:21:21.147 回答
4

你可以试试 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 :)

于 2015-04-01T13:22:09.723 回答
2

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

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

    你会收到这样的文件:

    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 <colNum>并获取最后一列。
  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 "<resource-root path=\"{}\" />"

输出包含 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 页眉和页脚包装,就完成了!

于 2011-10-16T17:29:40.080 回答
1

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

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

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

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

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

于 2013-11-09T15:03:30.443 回答