使用Maven进行EJB打包及其依赖库

8
我遇到了一个问题,如何正确地将我的企业(EAR)应用程序与简单的WAR和EJB3模块打包为JBoss7应用服务器。问题在于,EJB模块正在使用XML-RPC库(来自Apache),但在部署EAR时仍然会出现“NoDefClassFound”(来自此xmlrpc库的类)。
问题在于,maven-ejb-plugin不会在最终的EJB jar中打包依赖项,但是maven-ear-plugin确实会将其打包到EAR目录的根目录中。
当EAR被部署时,在内部EJB模块上调用INSTALL,但它找不到xmlrpc库类(它没有与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文件的相关部分。 - Perception
范围提供在哪里?在EJB jar包中吗?这不会将条目添加到类路径(当使用maven-ejb-plugin时),也不会将jar包打包。 - zdenda.online
看起来我已经成功将xmlrpc jar(使用maven-dependency-plugin)和清单条目都放在EJB jar中了。但是我仍然遇到了NoClassDefFoundError错误。我有什么遗漏的吗? - zdenda.online
你能发布完整的异常吗? - shelley
谢谢 Shelley。我解决了这个问题,见下面的回复。 - zdenda.online
显示剩余2条评论
2个回答

10

我成功解决了问题。似乎这些库必须被打包在/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>
...

如果这个答案对你有用,请标记它为被接受的答案,以便未来的观众知道它是有效的。 - Nightfirecat
我会接受,但我需要19小时才能完成(StackOverflow的规定)。 - zdenda.online
3
你在 EJB 配置中是否保留了 <addClasspath>true</addClasspath>?请确认。 - Snekse
1
当然,他必须在EJB pom文件中保留<addClasspath>true</addClasspath>以引用EAR文件中打包的库。 - Samy Omar
感谢所有的评论。无论如何,这些都有点过时了,因为EAR时代已经过去了。 - zdenda.online
@d1x,为什么你说EAR已经过时了?我也遇到了类似的问题-我的远程接口库是EJB jar的依赖项,但并没有被打包在jar中(参考http://stackoverflow.com/questions/28768762/building-deploying-a-ejb-jar-with-its-dependencies),建议的方法似乎是将所有东西打包在EAR中,就像你做的那样。还有其他的替代方法吗? - Michael Repucci

6
你在EJB配置中是否留下了<addClasspath>true</addClasspath>?您可以保留它,但是服务器启动时会有大量日志条目(WARN)抱怨类路径条目。我更喜欢将其设置为false。<addClasspath>false</addClasspath>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接