缺少cxf.xml?在maven中失败,在Eclipse中工作

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中复制这个?

Mat*_*att 3

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

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

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