缺少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。