网上看了百度了好长时间,头都大了,还是没有把想要的最简jar包找到,不是jar仍然很多,就是jar包少了,导致报错。无奈之下,自己花了一个下午,采用用逆推法,总结了下cxf3.0.4结合spring搭建webservice服务端的框架必需的最少jar包。
方法很笨,但是很有效:直接先加载cxf3.0.4中lib下的所有jar包,结合spring搭建一个最简单的webservice服务框架。然后逐个删除项目下的cxf相关的jar包。
下面是测试结果,只列出报错了的测试:
1、
org.apache.catalina.LifecycleException: A child container failed during start
缺少:
cxf-core-3.0.4.jar
(最核心的包,不多说)
2、
java.lang.ClassNotFoundException: org.apache.cxf.binding.soap.SoapBindingConfiguration
缺少:
cxf-rt-bindings-soap-3.0.4.jar
(soap协议)
3、
org.apache.cxf.jaxb.JAXBDataBinding:
缺少:
cxf-rt-databinding-jaxb-3.0.4.jar
4、加载Application文件时出现
Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/jaxws]
缺少:
cxf-rt-frontend-jaxws-3.0.4.jar
(frontend 前置的意思,你懂的)
5、
org/apache/cxf/frontend/spring/ClientProxyFactoryBeanDefinitionParser错误:
缺少:
cxf-rt-frontend-simple-3.0.4.jar
6、
class path resource [META-INF/cxf/cxf-servlet.xml] cannot be opened because it does not exist
缺少:
cxf-rt-transports-http-3.0.4.jar
7、
org.apache.cxf.BusException: No DestinationFactory was found for the namespace http://cxf.apache.org/transports/udp.
缺少:
cxf-rt-transports-udp-3.0.4.jar
8、
org.apache.cxf.ws.discovery.internal.WSDiscoveryServiceImpl startup
警告: Could not start WS-Discovery Service.
javax.xml.ws.WebServiceException: java.lang.NullPointerException
不能初始化配置的bean服务,也就是运行到<jaxws:server>时出错
缺少:
cxf-rt-ws-addr-3.0.4.jar
9、
java.lang.ClassNotFoundException: org.apache.cxf.ws.policy.AssertionInfoMap
缺少:
cxf-rt-ws-policy-3.0.4.jar
10、
java.lang.ClassNotFoundException: org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean
缺少:
cxf-rt-wsdl-3.0.4.jar
11、
java.lang.ClassNotFoundException: org.apache.neethi.AssertionBuilderFactory
缺少:
neethi-3.0.3.jar
12、
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
缺少:
slf4j-api-1.7.9.jar
13、
java.lang.ClassNotFoundException: org.apache.ws.commons.schema.resolver.URIResolver
缺少:
xmlschema-core-2.2.1.jar
所以,总结cxf3.0.4框架必需的包为:
cxf-core-3.0.4.jar cxf-rt-bindings-soap-3.0.4.jar cxf-rt-databinding-jaxb-3.0.4.jar cxf-rt-frontend-jaxws-3.0.4.jar cxf-rt-frontend-simple-3.0.4.jar cxf-rt-transports-http-3.0.4.jar cxf-rt-transports-udp-3.0.4.jar cxf-rt-ws-addr-3.0.4.jar cxf-rt-wsdl-3.0.4.jar cxf-rt-ws-policy-3.0.4.jar cxf-rt-wsdl-3.0.4.jar neethi-3.0.3.jar slf4j-api-1.7.9.jar xmlschema-core-2.2.1.jar
注意:这里不包括spring依赖包和commoms下的jar包
引入CXF Bean定义如下,早期的版本中使用,如果是servlet引入的话则下面三句不用了,因为框架引入了
配置文件中不需要:
<import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<!-- scope="singleton"单例 --> <bean id="userServiceBean" class="com.winit.webservice.UserWebService"> </bean> <!-- 注意下面的address,这里的address的名称就是访问的WebService的name --> <jaxws:server id="userService" serviceClass="com.winit.webservice.IUserWebService" address="/Users"> <jaxws:serviceBean> <!-- 要暴露的 bean 的引用 --> <ref bean="userServiceBean"/> </jaxws:serviceBean> </jaxws:server>
web.xml中添加cxf的servlet
<servlet> <servlet-name>CXFService</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CXFService</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping>
项目名是 WebAdvanced,服务启动后,访问链接:
http://localhost:8080/WebAdvanced/webservice/Users?wsdl。说明发布的webservice服务成功。
最后,“尽信书则不如无书”,当你无路可走,没有好的思路时,最笨的方法,往往是最直接有效的方法。