从Tomcat调用EJB时​​的NoClassDefFoundError - 类是类路径上的POJO

时间:2011-11-02 16:37:47

标签: ejb-3.0 jboss5.x noclassdeffounderror

我有以下安排:

 Tomcat   --EJB-invokation-->  JBoss
(6.0.14)                      (5.1.0)

两台服务器在同一台机器上运行。

当我运行Tomcat webapp时,我在Tomcat日志中收到以下错误:

2011-11-02 15:59:02,077 [http-9320-4] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/frontend].[action]- "Servlet.service()" pour la servlet action a généré une exception
javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/mycompany/app/transfer/internal/dto/account/AccountWithDemandDTO
        at com.mycompany.app.back.services.ServiceImpl.findAccount(ServiceImpl.java:925)
        at com.mycompany.app.back.services.ServiceImpl.findAccount(ServiceImpl.java:879)
        at sun.reflect.GeneratedMethodAccessor2703.invoke(Unknown Source)
        ...

没有被发现的类构成了JBoss的一部分:

applicationear.ear
    - META-INF
        - application.xml
        - ...
    - transfer-internal-dto-6.0.9.jar
    - ...

application.xml由以下内容组成:

<?xml version="1.0" encoding="UTF-8" ?> 
<application ...>
    <display-name>myapp</display-name>
    <module><ejb>backend-services-6.0.9.jar</ejb></module>
    <module><java>transfer-internal-dto-6.0.9.jar</java></module>
    ...
</application>

看看JMX控制台,我可以看到这个Jar文件以及构成耳朵的其他jar文件已经部署:

id="vfszip:/misc/JavaEE/package/myapp/back/6.0.9/deploy/applicationear.ear/transfer-internal-dto-6.0.9.jar/",type=SubDeployment

所以对我来说,这个课程出现在JBoss上。在Tomcat端,客户端应用程序部署为战争:

frontend.war
     - WEB-INF
         - lib
             - transfer-internal-dto-6.0.9.jar
             - ...
     - META-INF
         - MANIFEST.MF

清单中的Class-Path声明包含lib/transfer-internal-dto-6.0.9.jar

我有点担心问题可能是什么 - 有没有人有任何想法?

一些有用的信息:

  • Java 1.6.0_18
  • 所有内容均使用Maven打包
  • 应用程序使用twiddle部署在JBoss上 - 禁用热部署
  • 这是在机器正常重启后发生的 - 同样的应用程序在重启之前工作 - 应用程序在重启之间没有被修改
  • DTO对象是一个实现Serializable的POJO - 该类的两个字段是其他POJO(两者都在同一个jar中实现Serializable)。其中一个辅助POJO引用了两个不同的.jar的枚举。辅助.jar在application.xml和MANIFEST.MF文件中正确定义。此树中的所有POJO都没有静态初始化程序,也没有类似的实例化时间代码。
  • 这种安排在我们的测试环境中运行良好
  • JBoss日志中没有任何内容
  • 客户端是Struts应用程序

1 个答案:

答案 0 :(得分:0)

最后,我在测试和生产环境中采用了不同的JMX控制台,并发现了一些差异。这是特别奇怪的,因为环境是掌握的(即它们是从脚本创建的),应用程序也是从脚本部署的,一切都在计划关闭之前有效。因此,在部署过程中,唯一可能出现的问题就是某种问题。

因此我们重新启动了JBoss服务器,一切运行正常。