由于项目中用到了CXF发布webservice应用,客户最终要部署要was9上面.
使用的CXF版本是3.1.1,在tomcat下测试都好好的,发布到was9上面就开始报错:
Caused by: org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.PolicyBuilderImpl.
at org.apache.cxf.bus.extension.Extension.tryClass(Extension.java:182)
at org.apache.cxf.bus.extension.Extension.getClassObject(Extension.java:194)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.activateAllByType(ExtensionManagerImpl.java:142)
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:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
... 39 more
Caused by: java.lang.NoClassDefFoundError: org/apache/neethi/PolicyBuilder
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2733)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1124)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
at org.apache.cxf.bus.extension.Extension.tryClass(Extension.java:163)
... 49 more
Caused by: java.lang.ClassNotFoundException: org.apache.neethi.PolicyBuilder
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1491)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 57 more
org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl.
解决办法:
首先,在tomcat下运行时可以的,由于是将项目发布到was上的,需要逐步进行排除检查:
第一步:检查打包好的项目的classpath下面有没有neethi-3.1.1.jar,如果没有则加载到项目中;
第二步:CXF 与 websphere 会发生不兼容,处理方式是在websphere控制台创建共享库,并引入neethi-3.1.1.jar
第三步:安装项目的时候,指引共享库,并调整WAS 的类加载顺序,并优先去父类寻址。
备注:
1、was调用jar包默认顺序是先子类后父类,找不到jar才去父类寻找。
2、对于was发布项目的jar包冲突问题,主要会发生在不同应用之间的同名jar,导致版本问题。可以通过共享库来解决。