Я в процессе переноса устаревшего приложения из 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?
Я смотрю в совершенно неправильном направлении, чтобы решить эту проблему?