Проблема загрузчика классов с EJB - PullRequest
1 голос
/ 11 августа 2010

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

java.lang.NoClassDefFoundError: Could not fully load class: manager.administration.vehicles.VehicleTypeAdminBean
 due to:manager/vehicles/VehicleType
 in classLoader: 
org.apache.geronimo.kernel.classloader.TemporaryClassLoader@18878c7
    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-проект содержит ссылку на постоянный проект, а веб-проект содержит ссылки на оба проекта. Я не получаю никаких ошибок компиляции, поэтому я полагаю, что классы и ссылки верны.

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

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

Ответы [ 2 ]

1 голос
/ 11 августа 2010

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

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

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

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

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

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

0 голосов
/ 18 сентября 2013

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

1- Экспорт моих EJB-файлов в JAR (MyEJBs.jar) 2- Я создал еще один jar с your_installation_path / IBM / SDP / runtimes / your_version / binCreateEJBStrub.bat через CMD.exe, выполнив эту команду:

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

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

4 - поместите новый jarв WebContent / WEB-INF / lib

5- Вызовите свои EJB по:

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

Теперь вы можете вызывать свои EJB из другого EAR

...