gpt4 book ai didi

java - 缺少 cxf.xml?在 Maven 中失败,在 Eclipse 中工作

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:25 24 4
gpt4 key购买 nike

我正在使用 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 运行时,出现以下错误:

Exception in thread "main" org.apache.cxf.service.factory.ServiceConstructionException at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:197) at com.theopentutorials.jaxrs.calc.CalcRESTStartUp.main(CalcRESTStartUp.java:15) Caused by: org.apache.cxf.BusException: No DestinationFactory was found for the namespace http://cxf.apache.org/transports/http. at org.apache.cxf.bus.managers.DestinationFactoryManagerImpl.getDestinationFactory(DestinationFactoryManagerImpl.java:130) at org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:88) at org.apache.cxf.endpoint.ServerImpl.(ServerImpl.java:72) at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:155) ... 1 more

到目前为止,我在 Google/StackOverflow 上找到的所有内容都表明此错误来自缺少的 META-INF/cxf/cxf.xml 文件 - 这是有道理的,因为我没有其中之一。但是它在 Eclipse 中是如何工作的呢?

会不会是 Eclipse 正在从恰好具有我需要的配置的依赖 jar 之一中获取 cxf.xml 文件,但是当使用 Maven 打包时,它会以不同的顺序获取它们,因此不起作用?我试图创建自己的 cxf.xml 文件,但我不确定要使用哪个(maven 构建日志表明在我的所有依赖项之间,该文件大约有 12 个副本)- 有没有办法找到出哪一个 Eclipse 正在拾取?

编辑1

我尝试使用 eclipse 导出具有解压缩依赖项的可运行 jar 文件,当 eclipse 导出的 jar 时,我收到类似但略有不同的消息:

Cannot find any registered HttpDestinationFactory from the Bus. org.apache.cxf.transport.http.HTTPTransportFactory

Exception in thread "main" org.apache.cxf.service.factory.ServiceConstructionException at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:199) at com.theopentutorials.jaxrs.calc.CalcRESTStartUp.main(CalcRESTStartUp.java:15) Caused by: java.io.IOException: Cannot find any registered HttpDestinationFactory from the Bus. at org.apache.cxf.transport.http.HTTPTransportFactory.getDestination(HTTPTransportFactory.java:295) at org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:93) at org.apache.cxf.endpoint.ServerImpl.(ServerImpl.java:72) at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.create(JAXRSServerFactoryBean.java:155)

EDIT2

我尝试使用 eclipse 导出一个可运行的 jar 文件,其中包含“将所需的库打包到 jar 中”——到目前为止这似乎是可行的。是否可以在 maven 中复制它?

最佳答案

当我在一些 Spring 库中遇到完全相同的问题时,我发现了这个问题的正确解决方法是使用 Maven Shade 插件:

http://maven.apache.org/plugins/maven-shade-plugin/

因为几个 cxf-* jar 中有同名文件(例如 META-INF/cxf/cxf.xml),正常的 jar-with-dependencies 构建将包含第一个,然后忽略所有后续文件发现为“重复”。阴影插件会将这些文件连接在一起,因此您最终会得到一个大文件,其中包含您需要的所有条目。

关于java - 缺少 cxf.xml?在 Maven 中失败,在 Eclipse 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com