Mat*_*att 5 java eclipse cxf maven
我正在使用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>
Run Code Online (Sandbox Code Playgroud)
这是我的主要课程:
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();
}
Run Code Online (Sandbox Code Playgroud)
其中ResultsXml基本上是一个带注释的pojo类.在Eclipse中运行时,我可以在localhost:9999/open /上发出请求,然后我得到了我期望的JSON.但是,当我在maven中构建然后使用java -jar myjarfile.jar运行时,我收到以下错误:
异常线程"main" org.apache.cxf.service.factory.ServiceConstructionException在org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:197)在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)在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文件,这个文件恰好具有我需要的配置,但是当使用maven打包时,它会以不同的顺序选择它们,因此不起作用?我试图创建自己的cxf.xml文件,但我不确定哪一个(maven构建日志建议在我的所有依赖项之间,大约有12个文件副本)要使用 - 有没有办法找到Eclipse正在挑选哪一个?
EDIT1
我尝试使用eclipse导出带有解压缩依赖项的可运行jar文件,当eclipse导出的jar我得到一个类似但略有不同的消息:
从总线上找不到任何已注册的HttpDestinationFactory.org.apache.cxf.transport.http.HTTPTransportFactory
异常线程 "main" org.apache.cxf.service.factory.ServiceConstructionException在org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:199)在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)在org.apache.cxf.endpoint.ServerImpl .(ServerImpl.java:72)org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:155)
EDIT2
我尝试使用eclipse导出一个带有'package required libraries into jar'的可运行jar文件 - 到目前为止,这似乎正在起作用.是否有可能在maven中复制这个?
当我对某些 Spring 库遇到完全相同的问题时,我发现正确的解决方法是使用 Maven Shade 插件:
http://maven.apache.org/plugins/maven-shade-plugin/
因为几个 cxf-* jar 中包含具有相同名称的文件(例如 META-INF/cxf/cxf.xml),所以正常的 jar-with-dependencies 构建将包含第一个文件,然后忽略它发现的所有后续文件,如 '复制'。阴影插件会将这些文件连接在一起,因此您最终会得到一个大文件,其中包含您需要的所有条目。
| 归档时间: |
|
| 查看次数: |
2933 次 |
| 最近记录: |