我们有一个包含3个EJB模块的EAR。我正在尝试部署到glassfish,但我遇到了一个错误,我无法解释或弄清楚如何最好地识别。
[#|2010-08-03T14:39:15.570+0100|INFO|glassfish3.0.1|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|[AutoDeploy] Selecting file /export/home/myapp/apps/domains/myapp/autodeploy/App-ear.ear for autodeployment.|#]
[#|2010-08-03T14:39:18.654+0100|WARNING|glassfish3.0.1|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: com/company/app/controller/IMessagingProcessor|#]
[#|2010-08-03T14:39:20.470+0100|SEVERE|glassfish3.0.1|global|_ThreadID=28;_ThreadName=Thread-1;|Class [ Lcom/company/app/jms/IJmsSessionFactory; ] not found. Error while loading [ class com.company.app.eventprocessor.provider.EventProvider ]|#]
我已经检查了ClassNotFoundException中提到的类,它们在耳中是一个Jar,我在eclipse / maven中没有编译问题。
D:\Repository\App\AppEA\App-ear\target\App-ear.ear\CoreJms-1.0-SNAPSHOT.jar\com\company\app\controller\IMessagingProcessor.class
D:\Repository\App\AppEA\App-ear\target\App-ear.ear\EventProcessor-ejb-1.0-SNAPSHOT.jar\com\company\app\eventprocessor\provider\EventProvider.class
非常感谢任何指针。
詹姆斯
答案 0 :(得分:4)
实际上,你没有得到ClassNotFoundException
,你得到的是NoClassDefFoundError
,我怀疑某些依赖关系会丢失,如下所示:
Class [ Lcom/company/app/jms/IJmsSessionFactory; ] not found. Error while loading [ class com.company.app.eventprocessor.provider.EventProvider
com.company.app.jms.IJmsSessionFactory
在哪里?
我现在已将耳朵切换到单个ejb模块,并且正在获取Lorg / apache / log4j / Logger的NoClassDef但是log4j jar也在耳边。感觉我必须遗漏一些基本的东西吗?
log4j.jar
到底在哪里?在/lib
?你能真正展示你的EAR的结构吗?并且还请显示EJB-JAR的MANIFEST.MF
。
以防万一,以下是Packaging EJB 3 Applications的相关引用:
打包EJB-JAR
...
EJB-JAR文件必须包含 接口和bean类。有可能 还包括任何帮助程序类。 可选地,辅助类可以是 打包在一个单独的JAR文件中 EAR文件。您有两种选择:
- 包含帮助程序类的JAR可以打包在lib目录中 的EAR文件。使用这种方法, 打包的类将是 自动对所有模块可见 在EAR模块中。
- 如果要将可见性限制为仅限特定的EJB-JAR或WAR 模块,你可以在中创建一个条目 该模块的Manifest.mf文件 包含一个Class-Path属性 JAR文件。
现在你知道了它的结构 EJB-JAR以及如何打包它,让我们来吧 看看
的元素ejb-jar.xml
。
根据您的评论,我认为我正在解决我的问题。看来我没有正确包装耳朵,我认为maven依赖关系没有被正确引用。如果我只是构建我的ejb jar,它不包括任何依赖的jar。我应该在pom中指定包含罐子ejb-jar的东西吗?我有构建插件
<artifactId>maven-ejb-plugin</artifactId>
和打包<packaging>ejb</packaging>
设置。
不支持将依赖项捆绑到EJB-JAR中(参见MEJB-3),主要是因为jar-within-jar不是JAR specification的一部分(并且可能不受所有EJB容器支持)和一般不符合Sun's advice regarding J2EE packaging。
因此,虽然您可以忽略此规则(请参阅this trick或this one),但标准方法是将EJB-JAR及其依赖的所有JAR打包在EAR中。这是我的建议,我认为这篇文章可能有所帮助:Because I always forget how to use maven-ear-plugin。