缺少cxf.xml? 在maven中失败,在Eclipse中工作
我正在使用Apache CXF JAX-RS在Eclipse中构建项目。 当我在Eclipse中运行我的主类时,它工作正常。 当我在maven中构建一个具有依赖关系的jar时,它不起作用。 这是我的pom.xml(我通过运行“mvn clean compile assembly:single”来构建):
4.0.0 com.theopentutorials.jaxrs JsonCxfProvider 0.0.1-SNAPSHOT jar org.apache.cxf cxf-rt-frontend-jaxrs 2.7.4 org.apache.cxf cxf-rt-transports-http-jetty 2.7.4 org.apache.cxf cxf-rt-rs-extension-providers 2.7.4 org.slf4j slf4j-log4j12 1.7.5 org.codehaus.jettison jettison 1.3.3 javax.xml.bind jaxb-api 2.2.7 maven-assembly-plugin com.theopentutorials.jaxrs.calc.CalcRESTStartUp jar-with-dependencies
这是我的主要课程:
public static void main(String[] args) { JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); sf.setResourceClasses(ResultsXml.class); sf.setResourceProvider(ResultsXml.class, new SingletonResourceProvider(new ResultsXml())); sf.setAddress("http://localhost:9999/open/"); Server server = sf.create(); }
其中ResultsXml基本上是一个带注释的pojo类。 在Eclipse中运行时,我可以在localhost:9999 / open /上发出请求,然后我得到了我期望的JSON。 但是,当我在maven中构建然后使用java -jar myjarfile.jar运行时,我收到以下错误:
org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:197)中的线程“main”org.apache.cxf.service.factory.ServiceConstructionException中的exception,位于com.theopentutorials.jaxrs.calc.CalcRESTStartUp.main(CalcRESTStartUp) .java:15)引起:org.apache.cxf.BusException:找不到命名空间http://cxf.apache.org/transports/http的 DestinationFactory。 org.apache.cxf.bus.managers.DestinationFactoryManagerImpl.getDestinationFactory(DestinationFactoryManagerImpl.java:130)org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:88)at org.apache.cxf.endpoint.ServerImpl 。(ServerImpl.java:72)org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:155)… 1更多
到目前为止,我在Google / StackOverflow上找到的所有内容都表明此错误来自缺少的META-INF / cxf / cxf.xml文件 – 这是有道理的,因为我没有其中之一。 但是它如何在Eclipse中发挥作用呢?
是不是Eclipse正在从其中一个依赖jar中挑选一个cxf.xml文件,而这个依赖jar碰巧有我需要的配置,但是当用maven打包时,它会以不同的顺序选择它们,因此不起作用? 我试图创建自己的cxf.xml文件,但我不确定哪一个(maven构建日志表明我所有的依赖项之间,大约有12个文件的副本)要使用 – 有没有办法找到Eclipse正在挑选哪一个?
EDIT1
我尝试使用eclipse导出带有解压缩依赖项的可运行jar文件,当eclipse导出的jar我得到一个类似但略有不同的消息时:
无法从总线上找到任何已注册的HttpDestinationFactory。 org.apache.cxf.transport.http.HTTPTransportFactory
org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:199)中的线程“main”org.apache.cxf.service.factory.ServiceConstructionException中的exception,位于com.theopentutorials.jaxrs.calc.CalcRESTStartUp.main(CalcRESTStartUp) .java:15)引起:java.io.IOException:无法从总线中找到任何已注册的HttpDestinationFactory。 org.apache.cxf.transport.http.HTTPTransportFactory.getDestination(HTTPTransportFactory.java:295)org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:93)at org.apache.cxf.endpoint.ServerImpl 。(ServerImpl.java:72)org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:155)
EDIT2
我尝试使用eclipse导出一个可运行的jar文件,其中’package required libraries into jar’ – 到目前为止,这似乎正在起作用。 是否有可能在maven中复制这个?
这个maven-shade-plugin配置对我有用:
org.apache.maven.plugins maven-shade-plugin 1.7 package shade ${artifactId}-${version} true jar-with-dependencies com.logslie.main META-INF/cxf/cxf-extension-xml.xml META-INF/cxf/bus-extensions.txt META-INF/cxf/cxf-extension-http-jetty.xml META-INF/cxf/cxf-extension-http.xml META-INF/cxf/cxf-servlet.xml META-INF/cxf/cxf.xml *:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA
似乎正确的解决方法,我发现当我遇到与一些Spring库完全相同的问题时,就是使用Maven Shade插件:
http://maven.apache.org/plugins/maven-shade-plugin/
因为几个cxf- * jar中的文件名相同(例如META-INF / cxf / cxf.xml),所以正常的jar-with-dependencies构建将包含第一个,然后忽略它找到的所有后续的’重复’。 shade插件会将这些文件连接在一起,因此最终会在最后包含一个包含所需条目的大文件。
我想你使用maven程序集插件创建的zip。 当使用jar-with-dependencies时,此插件会将依赖jar中的所有文件合并到一个jar文件中。 如果某个文件在各个jar中具有相同的名称和路径,则只保留其中一个重复的文件。 在您的情况下,我认为是来自cxf-rt-transports-http-jetty jar文件的/META-INF/cxf/bus-extensions.txt,它不会出现在生成的程序集zip文件中。 在Eclipse中,没有完成jar文件的合并,因此加载了每个bus-extensions.txt。
- 如何扩展JAXB,CXF或Hibernate工具生成的Java代码?
- CXF中的格式化XML输出?
- CXF抛出任何政策选择都不能满足
- 引起:java.net.SocketException:来自服务器的文件意外结束
- 在CXF +简单前端+ Aegis数据绑定中,SOAP响应错误地反序列化为null
- 具有长请求的Apache CXF客户端“连接重置”
- 加密加密属性文件中的密码
- CXF 2.7.7 org.apache.cxf.interceptor.Fault:意外的元素
- Apache CXF客户端在Eclipse中加载正常,但独立的jar在WSDLServiceFactory中抛出NullpointerException