我目前在使用Gradle构建的应用程序中使用CXF 3.1.9和Spring 4.3.5,并在Tomcat 8(TomEE 7.0.1)中运行。
我目前只指定以下显式CXF依赖项:
['cxf-rt-rs-extension-providers', 'cxf-rt-management'].each {
compile "org.apache.cxf:${it}:3.1.9"
}
这可以传递其他几个工件,包括cxf-core。
到目前为止,该应用程序刚刚提供REST请求,并且一直运行良好。我现在正尝试使用ClientBuilder向另一个服务添加一个简单的请求。当我尝试发送该消息时,我明白了:
SEVERE: Failed to determine BusFactory implementation class name.
java.lang.ClassCastException: class org.apache.cxf.bus.spring.SpringBusFactory
at java.lang.Class.asSubclass(Class.java:3404)
at org.apache.cxf.BusFactory.getBusFactoryClass(BusFactory.java:390)
我注意到其他一些人也遇到了类似的错误,但我没有看到对我的情况有意义的解决方案。
更新:
我认为这里有一个类加载冲突,所以我打开了详细的类加载,我确实看到CXF类都是从我的webapp WEB-INF / lib和容器中加载的#34 ; LIB"目录,特别是" BusFactory"类。
但是,我相信我拥有所有正确的设置来说服TomEE从webapp而不是容器加载所有CXF类。我有" openejb.classloader.forced-load = org.springframework,org.apache.cxf"在" system.properties"在Eclipse中的服务器定义中的文件,我有" disabled = true" in" cxf.properties"和" cxf-rs.properties"在同一个地方。
更新:
我还注意到,在我第一次引用" ClientBuilder"时,它正在从容器的lib中加载该类,所以我尝试添加" javax.ws。 rs.client"到'#34;强制加载"名单。不幸的是,这只是导致了一个不同的例外:
org.apache.cxf.interceptor.Fault: ClassCastException: attempting to castjar:file:.../apache-tomee-webprofile-7.0.1/lib/javaee-api-7.0.jar!/javax/ws/rs/client/ClientBuilder.class to jar:file:.../.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/uslMonitorService/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/client/ClientBuilder.class
at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:189)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:99)
...
Caused by: java.lang.LinkageError: ClassCastException: attempting to castjar:file:.../apache-tomee-webprofile-7.0.1/lib/javaee-api-7.0.jar!/javax/ws/rs/client/ClientBuilder.class to jar:file:.../.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/uslMonitorService/WEB-INF/lib/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/client/ClientBuilder.class
at javax.ws.rs.client.ClientBuilder.newBuilder(ClientBuilder.java:97)
at javax.ws.rs.client.ClientBuilder.newClient(ClientBuilder.java:114)
答案 0 :(得分:0)
我认为TomEE-plus配置文件打包了cxf库,因此您可能需要将cxf依赖关系的范围声明为provided
而不是compile
。