带有依赖库的 Maven EJB 打包

Posted

技术标签:

【中文标题】带有依赖库的 Maven EJB 打包【英文标题】:Maven EJB packaging with dependent libraries 【发布时间】:2011-12-30 15:56:34 【问题描述】:

我面临一个问题,如何使用简单的 WAR 和 EJB3 模块为 JBoss7 应用服务器正确打包我的企业 (EAR) 应用程序。问题是,EJB 模块正在使用 XML-RPC 库(来自 Apache),而在部署 EAR 期间,我仍然得到 NoDefClassFound(来自这个 xmlrpc 库的类)。

问题是,maven-ejb-plugin 在最终的 EJB jar 中打包依赖项,但 maven-ear-plugin 确实打包它位于 EAR 目录的根目录。

当 EAR 被部署时,INSTALL 在内部 EJB 模块上被调用,但它没有找到 xmlrpc lib 类(它不是用 EJB jar 而是用 EAR 打包的,并且它在清单中没有任何条目)。

EJB pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cz.ctu.fee.voxport.app_logic</groupId>
    <artifactId>core</artifactId>
    <version>1.0</version>
    <packaging>ejb</packaging>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlrpc</groupId>
            <artifactId>xmlrpc-common</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlrpc</groupId>
            <artifactId>xmlrpc-client</artifactId>
            <version>3.1.3</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ejb-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <ejbVersion>3.1</ejbVersion>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

有什么方法可以使用 maven 彻底解决这个问题?

【问题讨论】:

请发布您的 POM 的相关部分。 可能是 provided 的依赖项? 范围在哪里提供?在 EJB jar 上?这不会将条目添加到类路径(使用 maven-ejb-plugin 时),甚至不会将 jar 包添加到包中。 看来我设法在 EJB jar 中拥有 xmlrpc jar(使用 maven-dependency-plugin)和清单中的条目。但我仍然收到 NoClassDefFoundError。我错过了什么吗? 你能发布完整的例外吗? 【参考方案1】:

我设法解决了这个问题。似乎这些库必须打包在 /lib 目录中,而不是在 EAR 的根目录中。添加 defaultLibBundleDir 元素解决了这个问题。

例如:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <defaultLibBundleDir>lib</defaultLibBundleDir>
...

【讨论】:

如果这是对您有用的答案,请继续并将其标记为已接受的答案,让未来的观众知道什么对您有用。 我会接受,但我可以在 19 小时内完成(*** 规则) 您是否在 EJB 配置中留下了 &lt;addClasspath&gt;true&lt;/addClasspath&gt; 当然,他必须在EJB pom文件上留下true才能引用EAR文件中打包好的库 感谢所有关注的 cmets。无论如何,这些都已经过时了,因为 EAR 的时代已经过去了【参考方案2】:

您是否在 EJB 配置中留下了 &lt;addClasspath&gt;true&lt;/addClasspath&gt;

好吧,您可以这样保留它,但是您会在服务器上收到一堆日志条目 (WARN),开始抱怨类路径条目。 我更喜欢将其设置为 false。 &lt;addClasspath&gt;false&lt;/addClasspath&gt;

【讨论】:

以上是关于带有依赖库的 Maven EJB 打包的主要内容,如果未能解决你的问题,请参考以下文章

Java 工程打包成库需要依赖其它外部库的打包方式

Maven 无法解决具有多个存储库的递归依赖项

maven中包的依赖出现missing问题是因为啥

Maven - settings.xml里的offline节点的作用

maven中snapshot快照库和release发布库的区别和作用

从命令提示符执行带有多个类路径库的 jar 文件