将耳朵部署到Glassfish时出错

时间:2010-08-03 13:54:39

标签: java java-ee glassfish ejb-3.0

我们有一个包含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

非常感谢任何指针。

詹姆斯

1 个答案:

答案 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 trickthis one),但标准方法是将EJB-JAR及其依赖的所有JAR打包在EAR中。这是我的建议,我认为这篇文章可能有所帮助:Because I always forget how to use maven-ear-plugin