2013-07-10 1 views
4

websphere에 neethi-3.0.2와 함께 하나의 응용 프로그램 Apache CXF-2.7.5를 배포하고 있습니다. 아래 오류가 발생합니다. 내 응용 프로그램은 스프링으로 구동됩니다. Apache CXF를 Apache CXF-2.3.5로 저하 시켰습니다. 애플리케이션이 성공적으로 배포되었습니다. WAS 7과 호환되지 않는 neethi.jar

Tomcat7에서도 완벽하게 작동합니다.

pom.xml 파일에 neethi.jar (이전 버전 -> 2.5.x)의 종속성을 추가 (또는 재정의)하여 Tomcat에서이 문제를 재현 할 수 있습니다.

참고 : Apache CXF 2.7.5에는 neethi.jar (3.0.2)의 최신 버전이 함께 제공되므로 Tomcat7에서 문제가되지 않습니다.

스택 추적 neethi.jar 의 이전 버전을 따기 웹 분야가 아래와 같습니다 :

[7/9/13 19:46:38:577 GMT+05:30] 00000012 FfdcProvider I com.ibm.ws.ffdc.impl.FfdcProvider logIncident FFDC1003I: FFDC Incident emitted on /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/ffdc/server1_2a7e2a7e_13.07.09_19.46.38.57558021.txt com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest() 309 
[7/9/13 19:46:38:582 GMT+05:30] 00000012 webapp  E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[CXFServlet]: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cxf' defined in class path resource [META-INF/cxf/cxf.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.cxf.bus.spring.SpringBus]: Constructor threw exception; nested exception is org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl. 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:997) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) 
     at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1588) 
     at com.ibm.ws.webcontainer.webapp.WebApp.commonInitializationFinish(WebApp.java:350) 
     at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:292) 
     at com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:99) 
     at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:167) 
     at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:722) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.cxf.bus.spring.SpringBus]: Constructor threw exception; nested exception is org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl. 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162) 
     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:76) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990) 
     ... 35 more 
Caused by: org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl. 
     at org.apache.cxf.bus.extension.Extension.tryClass(Extension.java:173) 
     at org.apache.cxf.bus.extension.Extension.getClassObject(Extension.java:185) 
     at org.apache.cxf.bus.extension.ExtensionManagerImpl.activateAllByType(ExtensionManagerImpl.java:138) 
     at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:126) 
     at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:138) 
     at org.apache.cxf.bus.spring.SpringBus.<init>(SpringBus.java:47) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:45) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:515) 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) 
     ... 37 more 
Caused by: java.lang.IncompatibleClassChangeError: org.apache.neethi.AssertionBuilderFactory 
     at java.lang.ClassLoader.defineClassImpl(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:265) 
     at java.security.SecureClassLoader.defineClass(Unknown Source) 
     at com.ibm.ws.classloader.CompoundClassLoader._defineClass(CompoundClassLoader.java:726) 
     at com.ibm.ws.classloader.CompoundClassLoader.localFindClass(CompoundClassLoader.java:645) 
     at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:468) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:609) 

제가 설정을 시도 할 제안

답변

4

나는 웹 모듈 레벨에서 '상위 마지막'클래스 로딩을하고 WAR에서 jar 파일을 다음 삭제했다 : -

geronimo-servlet_3.0_spec-1.0.jar 
geronimo-javamail_1.4_spec-1.7.1.jar 
stax-api-1.0.1.jar 

이것은 AssertionBuilderFactory이 neethi의 2.0.5 버전에서 구현했기 때문에이다. jar하지만 CXF 2.7.5로 인해 사용중인 3.0.2의 인터페이스입니다.

이러한 jar 파일은 CXF 종속성으로 인해 빌드시 자동으로 추가되므로 WAS에 배치하기 전에 WAR에서 이러한 jar 파일을 수동으로 삭제해야합니다. 또한 배포 할 때마다 WAR에 대한 클래스 로더 설정을 변경해야합니다.

은 사용 다음 경로를 클래스 로더 순서를 변경하려면 : - 엔터프라이즈 응용 프로그램> MyApplicationWAR> 관리 모듈> MyApplicationWAR

편집 :

당신은 <exclusions> 태그를 사용하여 POM 파일에서 동일한 작업을 수행 할 수 있습니다

<dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-bundle-jaxrs</artifactId> 
      <version>${cxf.version}</version> 
      <exclusions> 
       <exclusion> 
        <groupId>org.apache.geronimo.specs</groupId> 
        <artifactId>geronimo-javamail_1.4_spec</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.apache.geronimo.specs</groupId> 
        <artifactId>geronimo-servlet_3.0_spec</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

<!-- Jettison Dependency --> 
     <dependency> 
      <groupId>org.codehaus.jettison</groupId> 
      <artifactId>jettison</artifactId> 
      <version>${jettison.version}</version> 
      <exclusions> 
       <exclusion> 
        <groupId>stax</groupId> 
        <artifactId>stax-api</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
+1

maven 의존성 정의에서''태그를 사용하여 이러한 의존성을 자동으로 제거 할 수 있다고 생각합니다. 전쟁 파일에서 수동으로 제거하는 것보다 훨씬 쉬울 것입니다. – shimon001

+0

네가 맞습니다. 나는 또한 그렇게했다. 대답 업데이트 – Bhuvan

0

도와주세요 WAS의 클래스 로더 속성 상위 클래스 로더 대신 응용 프로그램 클래스 로더로 설정하십시오. 이를 통해 WAS는 애플리케이션 내에 패키징 된 jar 파일을 선택합니다. HTH

1

예, WAS에 neethi의 이전 버전이있을 수 있습니다.

websphere의 lib 폴더에서 neethi jar의 이전 버전이 있는지 확인해야합니다. 다른 버전 충돌이있는 경우 자체 우선 클래스로드 방식을 사용하도록 컨테이너를 구성해야 할 수도 있습니다.

또 다른 옵션은 필요한 neethi.jar을 승인 된 디렉토리에 배포 한 다음 적절한 매개 변수로 VM을 시작하는 것입니다.

-2

최신 솔루션 인 neethi.jar를 Websphere의 Java 내의 빠른 디렉토리에 넣고 JVM을 다시 시작한 후 사용해보십시오.

+1

그 자체. 올바른 해결책은 응용 프로그램의 클래스 로더 정책을 상위 부모로 설정하는 것입니다. –

0

다음 세 개의 병을 제거하면 어떤 문제가 해결 될 수 있습니까? 비슷한 문제가 있지만 WAS에서 실행하는 대신 junit 테스트를 사용합니다. 내 pom에 neethi-3.0.1.jar 및 cxf-rt-core-2.7.4.jar가 있습니다. 그러나 나는 아직도 java.lang.IncompatibleClassChangeError를 얻을 : org.apache.neethi.AssertionBuilderFactory 을에서 org.apache.cxf.bus.extension.Extension 에 그래서 난 여전히 클래스 패스에 neethi의 이전 버전을 어떻게 든입니다 가정합니다. 어떻게 수정합니까? 제로니모 - servlet_3.0_spec-1.0.jar 제로니모 - javamail_1.4_spec-1.7.1.jar 이는 WebSphere 런타임에 예기치 못한 부작용이있을 수 있기 때문에 나쁜 해결책 STAX-API-1.0.1.jar

+0

Welcome to stackoverflow. 이것은 실제로 질문에 답하지 않습니다. 새로운 질문을 열어 보시고, 도움이된다고 생각하시는 분께는이 질문에 대한 배경 지식이 필요합니다. – Foon

+0

새로운 질문을 제출했습니다. – jimmy