2010-08-11 12 views
1

Я работаю над проектом, который включает в себя библиотеку персистентности (JPA 1.2), EJB 3 и уровень веб-презентации (JSF). Я разрабатываю приложение с использованием Eclipse, и приложение публикуется на WebSphere Application Server Community Edition (Geronimo 2.1.4) через плагин eclipse (но то же самое происходит, если я публикую вручную). При публикации на сервер я получаю следующее сообщение об ошибке:Проблема с загрузчиком классов с EJB

java.lang.NoClassDefFoundError: Could not fully load class: manager.administration.vehicles.VehicleTypeAdminBean 
due to:manager/vehicles/VehicleType 
in classLoader: 
[email protected]8c7 
    at org.apache.xbean.finder.ClassFinder.(ClassFinder.java:177) 
    at org.apache.xbean.finder.ClassFinder.(ClassFinder.java:146)...

В web.xml у меня есть ссылка на EJB:

<ejb-local-ref> 
    <ejb-ref-name>ejb/VehicleTypeAdmin</ejb-ref-name> 
    <ejb-ref-type>Session</ejb-ref-type> 
    <local>manager.administration.vehicles.VehicleTypeAdmin</local> 
    <ejb-link>VehicleTypeAdminBean</ejb-link> 
</ejb-local-ref> 

EJB проект имеет ссылку на персистенцию проекта, и веб-проект имеет ссылки на оба проекты. Я не получаю ошибок компиляции, поэтому я считаю, что классы и ссылки верны.

Я не знаю, является ли это проблемой сервера приложений, но я запускал ранее приложение на том же сервере, используя те же параметры конфигурации.

Кто-нибудь знает, что может быть проблемой?

ответ

1

Похоже, что не удалось найти класс manager.vehicles.VehicleType, когда он пытался создать/загрузить класс manager.administration.vehicles.VehicleTypeAdminBean.

Раньше я сталкивался с подобными проблемами. Когда загрузчик классов пытается загрузить класс, он смотрит на операторы импорта (и другие объявления использования класса), а затем пытается загрузить те классы и так далее, пока он не достигнет дна цепочки (т.е. java.lang.Object) , Если он не может найти один класс по цепочке (в вашем случае это выглядит так, что он не может загрузить VehicleType), тогда он укажет, что он не может загрузить класс в верхней части цепочки (в вашем случае VehicleTypeAdminBean).

Является ли класс VehicleType в другой банке? Если у вас есть веб-модуль и модуль EJB, у вас есть банка, содержащая класс VehicleType в соответствующих местах. Иногда с веб-проектами вы должны помещать банки в папку WebContent/WEB-INF/lib, иначе они их не найдут.

Разве обе эти проекты развернуты отдельно (т.е. два уха или одно ухо и одна война?) Или они вместе (т. Е. Одно ухо с баночками и война внутри?). Я предполагаю, что второй вы заявили, что ваш EJB местный?

Банки, от которых вы зависите, также должны быть объявлены в файлах MANIFEST.MF в проектах, которые его используют.

Я вроде как работаю на догадках, так как я не знаю вашу структуру проекта. Показ, который поможет немного. Но я все равно буду проверять, где находится VehicleType, относительно вашего класса EJB. Возможно, вы обнаружите, что это не то место, где вы думаете, что оно пришло в упаковочную или рабочую среду.

+0

Спасибо вы за свой ответ. Да, вы правы, мне не хватало банку с классом VehicleType в classpath. Я ссылался на него, но в развертывании он был опущен. Когда я добавил его для экспорта в eclipse, он был добавлен в classpath, и не возникла ошибка загрузки класса, поэтому проблема была решена. – Vladimir

0

Спасибо @Chris за идею WebContent/WEB-INF/lib! это работает для меня, выполнив следующие действия:

1- Экспорт мои EJBs в JAR (MyEJBs.jar) 2- я создал еще одну баночку с your_installation_path/IBM/SDP/Runtimes/your_version/binCreateEJBStrub.bat через CMD. ехе, выполнив следующую команду:

createEJBStubs.bat <my_path>/MyEJBs.jar -newfile –quiet 

3- новая баночка будет автоматически создан в том же каталоге, что и MyEJBs.jar имени MyEJBs_withStubs.баночка

4 Поместите новую банку в WebContent/WEB-INF/Lib

5 Позвоните EJBs по:

MyEJBRemote eJBRemote; 
InitialContext ic = new InitialContext(); 
obj = ic.lookup("your_ejb_name_jndi"); 
eJBRemote = (MyEJBRemote) PortableRemoteObject.narrow(obj, 
MyEJBRemote.class); 
eJBRemote = (MyEJBRemote) obj; 

Теперь вы можете позвонить EJBs из другого EAR