1

我目前在使用 Gradle 构建并在 Tomcat 8 (TomEE 7.0.1) 中运行的应用程序中使用 CXF 3.1.9 和 Spring 4.3.5。

我目前只指定以下明确的 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 和容器的“lib”目录,特别是“BusFactory”类中加载。

但是,我相信我有所有正确的设置来说服 TomEE 从 webapp 而不是容器加载所有 CXF 类。我在 Eclipse 服务器定义的“system.properties”文件中有“openejb.classloader.forced-load=org.springframework,org.apache.cxf”,在“cxf.properties”中有“disabled=true”和“cxf-rs.properties”在同一个地方。

更新

我还注意到,在我第一次引用“ClientBuilder”时,它正在从容器的库中加载该类,因此我尝试将“javax.ws.rs.client”添加到“强制加载”列表中。不幸的是,这只是导致了一个不同的例外:

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)
4

1 回答 1

0

我认为 TomEE-plus 配置文件将 cxf 库打包,因此您可能需要将cxf 依赖项的范围provided声明为而不是compile.

于 2017-03-10T01:22:55.213 回答