2011-05-11 4 views
0

나는 다음과 같은 구성으로 프로젝트가 있습니다CXF는 WebSphere 6.1 클래스 로딩 문제에

  • WebSphere Application Server에 $WAS_ROOT/java/jre/lib/ext 디렉토리에서 6.1.0.19
  • wsdl4j-1.6.2.jar (로를 WAS 6.1에 포함 된 wsdl4j-1.6.1 덮어 쓰기). $WAS_ROOT/lib/ext 디렉토리에서
  • CXF-2.4.0.jar (및 기타 종속성).
  • 웹 모듈 'Y'을 갖는 EAR 'X'.
  • 웹 모듈 'Y'에는 JAR 모듈 'Z' (WEB-INF/lib 디렉토리에 있음)이 있습니다.
  • 'Z'에는 CXF의 wsdl2java를 사용하여 생성 된 SOAP 웹 서비스를 구현하는 클래스 세트가 있습니다.
  • 'Y'는 'Z'에서 SOAP 웹 서비스 클라이언트를 호출하는 비즈니스 클래스 (WEB-INF/classes 디렉토리에 있음)를가집니다.

이 구성은 내 개발 환경 (WebSphere Application Server 6.1 런타임이있는 Rational Application Developer)에서 잘 작동합니다. CXF의로드하려고

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 것 같다 :하지만 품질 보증 환경에서, 나는 (스택 추적에 bolds에주의하십시오), 다음과 같은 예외가 있었다 서버 런타임에 존재하는 클래스.

나는 누군가가이 문제를 도와 바랍니다. 나는 매우 고맙게 여길 것이다. WAS_HOME/lib 디렉토리/내선에서

+0

은 어디 ClientLifecycleManager 클래스는 어디에 있습니까? cxf-2.4.0.jar에 있습니까?WAS_HOME/lib/ext /에 jar를 두는 것은 해당 디렉토리의 jar가 클래스 경로의 끝을 향하고 WAS 확장 클래스 로더가 "상위 우선"클래스 로딩을 사용하기 때문에 실제로 WAS 클래스를 대체하지 않습니다. –

답변

1

배치 항아리는 최후의 수단이어야한다.

는 항상 PARENT_LAST 클래스 로더 모드를 시도하고 수업을/항아리 먼저 집어 들었다.

이렇게하면 여러 가지 문제를 피할 수 있습니다.

응용 프로그램 서버

광범위하게이 디렉토리를 사용하는 것이 시작하고 충돌이있는 경우조차 시작하지 않을 수 있습니다.

문제를 해결하는 가장 좋은 방법은 클래스 로딩을 켜고 native_stdout/열려진 파일을보고 질문에 클래스 (들)을로드하는 사람을 확인하는 것입니다.

Bkail,

다르게 말하려는 것이 있습니까? 이 경로는 클래스 로더 체인의 상위에 있으므로 초기 (기본 PARENT_FIRST를 사용하여) 클래스 로딩 정책을 검사합니다.

이합니다 (JDK의 부트 로더 후) 두 번째 명령 전 단계에있을 것입니다 그것은 확장입니다.

HTH

Manglu은

+0

@bkail, @Manglu, 답변 해 주셔서 감사합니다. @Manglu, 당신은'WAS_HOME/lib/ext'에 항아리를 두는 것이 옳다. 'Z'Jar 모듈은 다른 프로젝트에 필요한 다른 비즈니스 클래스를 포함하고 있기 때문에 다른 버전을 가질 수 있기 때문에 상위 레벨에 배치 할 수 없다. 서버의 여러 프로젝트 중에서 좋은 점은이 애도가 클래스 로더 바이저를 활성화하고 서버를 다시 시작하여 비즈니스 규칙을 실행하면 효과가 있다는 것입니다. 마법? 나는 결코 알지 못할거야 ... –

관련 문제