CXF в WebSphere 6.1 Проблема с загрузкой классов

У меня есть проект со следующей конфигурацией:

  • Сервер приложений WebSphere 6.1.0.19
  • wsdl4j-1.6.2.jar в каталоге $WAS_ROOT/java/jre/lib/ext (для перезаписи wsdl4j-1.6.1, включенного в WAS 6.1).
  • cxf-2.4.0.jar (и другие зависимости) в каталоге $WAS_ROOT/lib/ext.
  • EAR 'X' с веб-модулем 'Y'.
  • Веб-модуль "Y" имеет модуль JAR "Z" (в каталоге WEB-INF/lib).
  • «Z» имеет набор классов, которые реализуют веб-службу SOAP, созданную с использованием CXF wsdl2java.
  • «Y» имеет бизнес-класс (в каталоге WEB-INF/classes), который вызывает клиент веб-службы SOAP в «Z».

Эта конфигурация хорошо работает в моей среде разработки (Rational Application Developer со средой выполнения WebSphere AS 6.1). Но в среде QA у меня было следующее исключение (обратите внимание на полужирный шрифт в трассировке стека):

org.apache.cxf.bus.extension.ExtensionException
at org.apache.cxf.bus.extension.Extension.loadInterface(Extension.java:134)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.loadAndRegister(ExtensionManagerImpl.java:160)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.getBeansOfType(ExtensionManagerImpl.java:256)
at org.apache.cxf.bus.CXFBusImpl.getExtension(CXFBusImpl.java:99)
at org.apache.cxf.endpoint.ClientImpl.notifyLifecycleManager(ClientImpl.java:186)
at org.apache.cxf.endpoint.ClientImpl.(ClientImpl.java:117)
at org.apache.cxf.frontend.ClientFactoryBean.createClient(ClientFactoryBean.java:104)
at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:92)
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:152)
at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142)
at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:464)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:331)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:318)
at javax.xml.ws.Service.getPort(Service.java:46)
at web.service.client.implementation.at.z.module.method(Unknown Source)
at business.class.at.y.web.module.method(AvisoCobroDAO.java:86)
... 32 more
Caused by: java.lang.ClassNotFoundException: org.apache.cxf.endpoint.ClientLifeCycleManager
at com.ibm.ws.classloader.CompoundClassLoader.findClass(CompoundClassLoader.java:472)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:373)

at java.lang.ClassLoader.loadClass(ClassLoader.java:561)
at org.apache.cxf.bus.extension.Extension.loadInterface(Extension.java:132)
... 51 more

Похоже, что CompoundClassLoader (который работает на уровне приложения) пытается загрузить класс CXF, который существует на уровне выполнения сервера.

Я надеюсь, что кто-нибудь поможет мне с этой проблемой. Буду очень-очень благодарен.


person Ronye Vernaes    schedule 11.05.2011    source источник
comment
Где находится класс ClientLifecycleManager? Это в cxf-2.4.0.jar? Обратите внимание, что размещение jar-файлов в каталоге WAS_HOME/lib/ext/ фактически не переопределяет классы WAS, поскольку jar-файлы в этом каталоге находятся ближе к концу пути к классу, а загрузчик класса расширения WAS использует загрузку родительского класса по первому классу.   -  person Brett Kail    schedule 12.05.2011


Ответы (1)


Размещение Jars в WAS_HOME/lib/ext должно быть вашим последним средством.

Всегда пробуйте режим загрузчика классов PARENT_LAST и сначала подбирайте свои классы/банки.

Это позволит избежать ряда проблем для вас.

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

Лучший способ устранения неполадок — включить загрузку классов и просмотреть файл native_stdout/stderr и посмотреть, кто загружает рассматриваемые классы.

Бкаил,

Ты хотел сказать по-другому? Этот путь находится высоко в цепочке загрузчика классов, поэтому он будет проверен ранее (с политикой загрузки классов по умолчанию PARENT_FIRST).

Это будет вторая ступень (после BOOT CLassloader JDK) и ее расширения.

ХТН

Манглу

person Manglu    schedule 12.05.2011
comment
@bkail, @Manglu, спасибо за ответ. @Manglu, вы правы насчет размещения банок на WAS_HOME/lib/ext, дело в том, что модуль Jar «Z» содержит другие бизнес-классы, необходимые для других проектов, и я не могу разместить его на более высоком уровне, потому что могут быть разные версии среди разных проектов на сервер. Хорошей новостью является то, что в этот траур я включаю Visor Class Loader, перезапускаю сервер и запускаю бизнес-правило, и оно работает! Черная магия? Я никогда не узнаю... - person Ronye Vernaes; 12.05.2011