2015-05-29 2 views
0

Я в процессе переноса устаревшего приложения из weblogic в Tomcat 6. Приложение должно получить доступ к ejbs; для этого я добавил wlclient.jar в classpath.Проблемы с загрузчиком классов при поиске ejb jndi names tomcat 6

Когда методы в старых банках, отвечающих за связь с EJBs называются, я получаю следующее исключение:

javax.naming.NamingException: Unhandled exception in lookup 
[Root exception is org.omg.CORBA.MARSHAL: vmcid: SUN minor code: 211 completed: Maybe] 

причиной которых является:

Caused by: java.lang.IllegalArgumentException: interface com.xxx.xxx.InterfaceName is not visible from class loader 
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) 
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) 
    at weblogic.iiop.ProxyDesc.readResolve(ProxyDesc.java:45) 

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

При работе с многословным классом я обнаружил, что интерфейс фактически загружен из локальной банки. Соответствующий интерфейс на сервере загружается слишком:

[Loaded com.xx.xx.InterfaceName_t3s99q_InterfaceNameIntf from http://192.168.x.xx:port/path/classes/] 

Даже если я не имею ни малейшего представления, как это работает внутри, я предположил, что поиск прошло хорошо, так как он находит правильный класс на сервере.

При установке контрольных точек в Proxy.getProxyClass я нашел используемый загрузчик классов при возникновении исключения Launcher$AppClassLoader; URL-адрес, который он использовал для поиска, был в моем локальном пути к классам (a.k.a. src/main/java и т. д.), а не пути webapp (a.k.a. WEB-INF/lib и т. д.).

Итак, мой вопрос: возможно ли, что неправильный ClassLoader используется для этого конкретного поиска (локальный вместо Webapp уровня 1 Tomcat)? Можно ли указать конкретный ClassLoader?

Я смотрю в совершенно неправильном направлении, чтобы решить эту проблему?

ответ

0

Ну, я потерял 1,5 дня, поэтому я отправлю ответ, надеясь, что он в конечном итоге будет полезен кому-то.

Проблема заключалась в том, что я включил wlclient.jar в classpath eclipse, и поскольку реализация oracle использует super.getClass().getClassLoader(), она вернет ClassLoader, используемый для загрузки класса, в котором вызов выполняется как локальный ClassLoader, а не из Webapp, поэтому он не имел видимости зависимостей webapp.

Я обновил свой проект, чтобы включить банку в WEB-INF/lib, поэтому он будет загружен webapp, и поэтому super.getClass().getClassLoader() вернет правильный ClassLoader.

Другой возможностью было бы изменить эту строку, чтобы вместо этого использовать Thread.currentThread.getContextClassLoader.