NoClassDefFoundError при вызове EJB из Tomcat - класс является POJO на пути к классам - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть следующая договоренность:

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

Два сервера работают на одном компьютере.

Когда я запускаю веб-приложение Tomcat, я получаю следующую ошибку в журналах 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
  • приложения развертываются на JBoss с использованием twiddle - горячее развертывание отключено
  • это произошло после изящного перезапуска машины - то же самое приложение работало до перезапуска - приложение не было изменено между перезапусками
  • объект DTO является POJO, который реализует Serializable - два поля класса являются другими POJO (оба реализуют Serializable, оба в одном и том же фляге). Один из этих вторичных POJO ссылается на два перечисления, которые находятся в другом .jar. Этот вторичный .jar правильно определен в файле application.xml и файле MANIFEST.MF. Ни один из POJO в этом дереве не имеет статического инициализатора и не имеет аналогичного кода времени создания.
  • эта схема отлично работает в нашей тестовой среде
  • в логах JBoss ничего нет
  • клиентская часть - это приложение Struts

1 Ответ

0 голосов
/ 03 ноября 2011

В конце я понял разницу между консолями JMX в наших тестовых и производственных средах и заметил некоторые различия. Это особенно странно, поскольку среды осваиваются (то есть создаются из сценариев), а приложения также развертываются из сценариев, и все работало до запланированного завершения работы. Поэтому единственное, что казалось возможным, это какая-то проблема во время развертывания.

Поэтому мы перезапустили сервер JBoss, и все заработало правильно.

...