首先描述一下我遇到的问题,使用cxf2.7.6版本,在tomcat下开发部署web service访问正常,但是发布到was8.0则提示错误,提示的错误为:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'f.jaxws.EndpointImpl--1944749225': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org/apache/ws/commons/ad(Lorg/w3c/dom/Document;Ljava/lang/String;)Lorg/apache/ws/commons/schema/XmlSchema;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.ateBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.Object(AbstractB
eanFactory.java:291)
at org.springframework.beans.factory.Singleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.Bean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
at t.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)
at t.fresh(AbstractApplicationContext.java:423)
at org.ateWebApplicationContext(ContextLoader.java:276)
at org.t.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
单是抛出的异常,很容易就定位问题是提示说在xmlschema包里不到这个方法。于是我就查看了工程里面的xmlschema包,我用的版本是xmlschema-core-2.0.3.jar,包里面明明有read方法,为什么提示说没有read方法呢。所以就有点怀疑工程里面的xmlschema.jar包使用了websphere的jar包,然后上网了资料。网上的各种方法都试过了,包括什么“拷贝xmlschema1.4.7版本的jar包到在WAS_HOME\java\jre\lib目录下建立endorsed子目录,将XmlSchema-1.4.7.jar文件拷入,重新启动was即可,在was7.0.0.15下测试成功。”,还有设置DisableIBMJAXWSEngine: true的等等,换jar包版本也换了好几次等等都没用。看来网上的解决方案不少人都是人云亦云,真正解决问题还是得靠自己。为了定位问题准确,我从网上下载了XmlSchema-1.4.7.jar版本的包,放到本地工程,把本地工程的xmlschema-core-2.0.3.jar去掉,然后启动tomcat,哈哈,这下tomcat抛出错误了,而且错误和替换包版本的w
ar发布在websphere后的错误一样,这就说明本地工程的xmlschema包的确是使用了websphere自带的版本包,而websphere的包显然是版本过低。那怎么才能优先使用自己的jar包呢,于是去修改了war包的类加载顺序,发觉正常的jar包也不能识别了,发布websphere抛出一大堆classCastException的类转换错误,最后只能想别的办法了。后来想到websphere有共享库这么一个功能,也就是说可以设置共享库,使得war能使用上自己的jar包版本。于是开始设置,下面是设置的步骤:
第一步,设置共享库
①把本地xmlschema-core-2.0.3.jar拷贝到websphere的lib包目录下
②打开环境->共享库
点击进去
点击新建,上面的作用域选择“节点=.....”
然后在新建页面填入内容如图:
其中,类路径填写jar包的绝对路径,这个路径也就是前面所说的把本地的xmlschema包拷贝到websphere路径的绝对路径地址。填完后保存。
第二步,设置服务器使用共享库
①点击服务器->服务器类型->Websphere Application Server
②点击蓝超链接进去
③点击服务器基础机构->java和进程管理
④点击类装入器
点击新建。
选择“类已装入并且是先使用本地类装入器(父类最后)”,然后确定。
点击“共享库引用”
点击“添加”,则能看到前面在共享库定义好的共享库名
第三步,在war包添加共享库的使用
点击蓝链接进去
点击共享库引用
勾选第一个,然后点击“引用共享库”,选择定义好的共享库,然后确定。
第四步,重启服务器,这一步是最后也是很重要的一步,所有设置只有在重启服务器才能生效。
点击这里的“重新启动”,等待重新启动后,访问web service地址,成功(保密原因所以把图片的ip去掉了)。
最后我开发cxf的webservice使用的jar包有:
spring framework版本查看注:如果你工程里面有jaxb-api-2.2.6.jar包jaxb-impl-2.2.6.jar这2个包得去掉,否则会抛其它错误,好像是什么factory的错误。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论