Классы ссылочного проекта EJB не найдены в (ссылающемся) веб-проекте - PullRequest
5 голосов
/ 29 сентября 2011

Я изучаю J2EE и EJB и столкнулся со странной проблемой.Это настройка моего проекта:

Я использую Glassfish 3.1 и Eclipse 3.7.У меня есть два проекта в Eclipse:

  1. EJB 3.0-совместимый проект, myEjbProject
  2. Динамический веб-проект, myWebProject

I 'm вставка сессионного компонента EJB mySessionBeanPackage.mySessionBean из myEjbProject в сервлет myServletPackage.myServlet в myWebProject и затем (в сервлете) вызов простого метода, определенного в сессионном компоненте.

Я предоставилmyWebProject со ссылкой на myEjbProject (используя диалог Свойства -> Ссылки на проект).Однако по какой-то причине сервер не может найти сессионный компонент.Точная ошибка, которую я получаю:

SEVERE: класс [LmySessionBeanPackage / mySessionBean] не найден.Ошибка при загрузке [class myServletPackage.myServlet]

Обратите внимание, что и EJB-проект и веб-проект были опубликованы на сервере, и я дважды проверил, что классфайл, сгенерированный для компонента, фактически присутствует на сервере (поэтому я не могу придумать причину, по которой сервер не может их найти).

Может кто-нибудь сказать мне, что ячто-то не так?

Я также пытался

  • явно добавить папку классов myEjbProject в список путей сборки Java -> Библиотеки myWebProject.Это в дополнение к ссылке на проект (хотя я думаю, что добавления ссылки на проект было бы достаточно в первую очередь).В любом случае, это не имеет значения (то же сообщение об ошибке, что и раньше).

  • создание JAR-файла из myEjbProject с использованием опции Export -> EJB Jar File (я не хочуначать писать сценарий Ant).Затем я поместил этот JAR-файл в раздел «Путь сборки Java -> библиотеки» myWebProject.Этот подход также не решает проблему (то же сообщение об ошибке, что и раньше).

  • изменение сессионного компонента для получения

    • без интерфейса
    • локальный интерфейс
    • удаленный интерфейс

    и изменение впрыска соответственно.Например, для компонента с только локальным интерфейсом я использовал:

    @EJB mySessionBeanPackage.mySessionBeanLocal myBean

    Этот подход также не решил проблему (то же сообщение об ошибке, что и раньше).

  • полностью исключил myEjbProject и добавил сессионный компонент в myWebProject как myServletPackage.mySessionBean (тот же пакет, что и сервлет).В этом случае я могу успешно внедрить сессионный компонент в сервлет, используя

    @EJB mySessionBeanPackage.mySessionBean myBean

  • , полностью исключив myEjbProject идобавление сессионного компонента в myWebProject как mySessionBeanPackage.mySessionBean (новый пакет).В этом случае я также могу успешно внедрить сессионный компонент в сервлет, используя

    @EJB mySessionBeanPackage.mySessionBean myBean

1 Ответ

12 голосов
/ 29 сентября 2011

Я бы порекомендовал взглянуть на фактический EAR, который Eclipse упаковывает и развертывает на сервере. Это можно сделать, экспортировав проект EAR (щелкните правой кнопкой мыши проект EAR -> экспорт -> Java EE -> файл EAR)

Я думаю, что вам не хватает шага - добавить проект EJB в файл MANIFEST WEB-проекта. Но на случай, если вы пропустите еще несколько шагов, я бы проверил следующее:

  1. EJB и WEB проекты являются модулями проекта EAR. Щелкните правой кнопкой мыши проект EAR -> свойства -> Сборка развертывания -> Добавить -> Проект -> выберите EJB и проект WEB. Если вы экспортируете свой проект EAR сейчас, вы заметите, что EJB и WEB-проект упакованы вместе с EAR.
  2. Добавление проекта EJB в МАНИФЕСТ ВЕБ-проекта. Щелкните правой кнопкой мыши веб-проект -> свойства -> Сборка развертывания -> Записи манифеста -> Добавить -> выберите проект EJB. Вы можете открыть файл MANIFEST.MF и увидеть, что он теперь включает проект EJB.

Также мне нравится добавлять проект EJB в путь сборки WEB-проекта, чтобы он был включен в путь к классу WEB: щелкните правой кнопкой мыши WEB-проект -> свойства -> Java Build Path -> Projects -> Add -> Select EJB ,

...