我正在使用Apache CXF JAX-RS在Eclipse中构建项目。当我在Eclipse中运行主类时,它可以正常工作。当我在Maven中构建具有依赖项的jar时,它不起作用。这是我的pom.xml(我通过运行“ mvn clean compile assembly:single”进行构建):
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.theopentutorials.jaxrs</groupId>
<artifactId>JsonCxfProvider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.theopentutorials.jaxrs.calc.CalcRESTStartUp</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>
这是我的主要课程:
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运行时,出现以下错误:
com.theopentutorials.jaxrs.calc.CalcRESTStartUp.main(CalcRESTStartUp.org)上的org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:197)上的线程“ main” org.apache.cxf.service.factory.ServiceConstructionException .java:15)原因:org.apache.cxf.BusException:找不到命名空间http://cxf.apache.org/transports/http的DestinationFactory 。在org.apache.cxf.endpoint.ServerImpl上的org.apache.cxf.bus.managers.DestinationFactoryManagerImpl.getDestinationFactory(DestinationFactoryManagerImpl.java:130)在org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:88) 。(ServerImpl.java:72)at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:155)...还有1个
到目前为止,我在Google / StackOverflow上能够找到的所有内容都表明此错误是由于缺少META-INF / cxf / cxf.xml文件引起的,这很有意义,因为我没有其中一个。但是,它如何在Eclipse中工作?
可能是Eclipse从一个碰巧具有我需要的配置的依赖罐中拾取了一个cxf.xml文件,但是当与maven打包时,它以不同的顺序拾取它们,所以行不通吗?我已经尝试创建自己的cxf.xml文件,但是我不确定要使用哪个文件(Maven构建日志建议在我所有的依赖项之间,大约有12个文件副本)-是否可以找到哪一个Eclipse正在使用?
编辑1
我尝试使用eclipse导出具有解压缩依赖项的可运行jar文件,当eclipse导出的jar时,我收到类似但微妙的消息:
从总线上找不到任何已注册的HttpDestinationFactory。org.apache.cxf.transport.http.HTTPTransportFactory
com.theopentutorials.jaxrs.calc.CalcRESTStartUp.main(CalcRESTStartUp)上的org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:199)上的线程“ main” org.apache.cxf.service.factory.ServiceConstructionException发生异常.java:15)原因:java.io.IOException:无法从总线上找到任何已注册的HttpDestinationFactory。在org.apache.cxf.endport.http.HTTPTransportFactory.getDestination(HTTPTransportFactory.java:295)在org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:93)在org.apache.cxf.endpoint.ServerImpl 。(ServerImpl.java:72)在org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:155)
编辑2
我尝试使用eclipse导出带有“将必需的库打包到jar中”的可运行jar文件-到目前为止,这似乎是可行的。是否有可能在Maven中复制它?
似乎正确的解决方法是使用Maven Shade插件,这是我在某些Spring库中遇到完全相同的问题时发现的:
http://maven.apache.org/plugins/maven-shade-plugin/
由于几个cxf- * jar都在其中包含相同名称的文件(例如META-INF / cxf / cxf.xml),因此常规的jar-with-dependencies构建将包括第一个,然后忽略它找到的所有后续文件,它们都是'复制'。shade插件会将这些文件连接在一起,因此最后得到一个大文件,其中包含所需的所有条目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句