笔者使用的CXF的版本是2.3.3,这是CXF官网到目前为止的最新版本。
在开发过程中,遇到下面的一个错误:
信息: Creating Service {http://webservice.cxf.demo/}IWebServiceSampleService from class demo.cxf.webservice.IWebServiceSample
Exception in thread "main" javax.xml.stream.FactoryConfigurationError: Requested factory com.ctc.wstx.stax.WstxOutputFactory cannot be located. Classloader =sun.misc.Launcher$AppClassLoader@1add2dd
at javax.xml.stream.FactoryLocator.loadFactory(FactoryLocator.java:120)
at javax.xml.stream.FactoryLocator.locate(FactoryLocator.java:109)
at javax.xml.stream.FactoryLocator.locate(FactoryLocator.java:54)
at javax.xml.stream.XMLOutputFactory.newInstance(XMLOutputFactory.java:29)
at org.apache.cxf.staxutils.StaxUtils.getXMLOutputFactory(StaxUtils.java:178)
at org.apache.cxf.staxutils.StaxUtils.createXMLStreamWriter(StaxUtils.java:229)
at org.apache.cxf.interceptor.StaxOutInterceptor.handleMessage(StaxOutInterceptor.java:70)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
at $Proxy34.say(Unknown Source)
at demo.cxf.test.WebServiceSampleClient.main(WebServiceSampleClient.java:80)
网上查了好些资料,有的说是 javax.xml.stream.XMLOutputStream等类的实现类冲突,有的说是JDK版本的问题,于是将我使用的JDK从1.6改为1.5,还是存在相同的问题。又按有的网上资料里说的,设置上面那个类的实现类,还是没有改决。
后来,干脆下载了CSF较低版本的来试,下载了2.2.12版本的CXF,发现其中的一个JAR包:wstx-asl-3.2.9.jar,在CXF2.3.3版本里是没有的,于是将这个包也放到项目的lib目录下,问题解决了。看来是官方网站里,不知怎么的将这个依赖包忘了发布了。
笔者整理的CXF2.3.3的最少依赖包有如下的几个:
- cxf-2.3.3.jar
- geronimo-annotation_1.0_spec-1.1.1.jar
- geronimo-jaxws_2.2_spec-1.0.jar
- geronimo-stax-api_1.0_spec-1.0.1.jar
- geronimo-ws-metadata_2.0_spec-1.1.3.jar
- jaxb-api-2.2.1.jar
- jaxb-impl-2.2.1.1.jar
- neethi-2.0.4.jar
- wsdl4j-1.6.2.jar
- XmlSchema-1.4.7.jar
- wstx-asl-3.2.9.jar(这个包是从CXF2.2.12发布包里拿过来的)
到目前为止是用这些包即可,当然这是特指CXF而言,我的项目里还有其它如Spring、struts2、日志等的相关包。