0
我有以下安排POJO:的NoClassDefFoundError當EJB - 類是在classpath
Tomcat --EJB-invokation--> JBoss
(6.0.14) (5.1.0)
兩個服務器在同一臺機器上運行。
當我運行Tomcat的web應用程序,我得到以下錯誤在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控制檯,我可以看到,THI s 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
- 應用程序部署使用JBoss的擺弄包裝 - 熱部署被禁用
- 這件事發生後,機器的平穩重啓 - 同一個應用程序在重啓前工作 - 應用程序在重啓之間未被修改
- DTO對象是一個POJO實現Serializable - 類的兩個字段是其他POJO(都在同一個jar中實現Serializable)。其中一個輔助POJO引用了兩個枚舉,它們位於不同的.jar中。該輔助.jar在application.xml和MANIFEST.MF文件中正確定義。這棵樹中沒有一個POJO具有靜態初始化器或類似的實例化時間代碼。
- 這種安排工作正常,我們的測試環境
- 沒有什麼在JBoss日誌
- 客戶端是一個Struts應用程序