Java Jersey应用程序启动时的NoSuchMethodError

时间:2015-02-13 21:51:04

标签: java maven jersey jax-rs jersey-2.0

尝试在Tomcat上启动Jersey应用程序时,我遇到了一个非常奇怪的错误。相同的代码适用于其他计算机。我尝试重新安装tomcat,我所有的maven依赖项,甚至是Eclipse和Java本身,没有运气。我觉得看起来好像是一个糟糕的泽西版本?

任何正确方向的指针都将受到赞赏。

这是有效的pom:http://pastebin.com/NacsWTjz

实际的pom:http://pastebin.com/H6sHe4ce

2015-02-13 13:43:40,870 [localhost-startStop-1] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/middleware-server] - StandardWrapper.Throwable
java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:304)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:285)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:170)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4901)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5188)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

4 个答案:

答案 0 :(得分:64)

注意:请参阅上述评论以获取进一步的讨论和提示。

这个错误通常意味着你在类路径上有一个JAX-RS 1和JAX-RS 2 jar。 Jersey 2使用JAX-RS 2(javax.ws.rs-api-2.0.1.jar),但是如果你还有jsr311-api.jar,那就是JAX-RS 1,每个jar中都有一个javax.ws.rs.core.Application。但是jsr311-api Application没有方法getProperties()(因此NoSuchMethodError)。

我得出的结论是,您需要做的就是将上述排除添加到swagger依赖项中。 Jackson 2.0提供程序(依赖于JAX-RS 1)似乎被2.4.1提供程序(使用新版本)覆盖。所以我们不需要自己添加它。当它被覆盖时,它似乎会留下jsr311-api.jar。因此,如果我们排除它,没有人可以尝试使用它,这看起来是当前的问题

<dependency>
    <groupId>com.wordnik</groupId>
    <artifactId>swagger-core_2.10</artifactId>
    <version>1.3.11</version>
    <exclusions>
        <exclusion>
            <groupId>javax.ws.rs</groupId>
            <artifactId>jsr311-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

答案 1 :(得分:0)

我们正在使用jersey-json 1.9,它依赖于jersey-core,它恰好也有javax.ws.rs.core.Application类。

所以我们的解决方法是从jersey-json中排除 jersey-core

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.9</version>
        <exclusions>
            <exclusion>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

答案 2 :(得分:0)

该问题与“ com.sun.jersey:jersey-core:jar:1.18.3”(或任何1. *版本)有关,因为Jersey的旧版本没有该“ public Map getProperties()”方法。

您的一个依赖项使用Jersey版本1(您可以在运行mvn依赖项:tree的同时检查并搜索使用的所有jersey-core版本)

我已经解决了删除所有com.sun.jersey相关性(旧api)并使用新的org.glassfish.jersey API的问题

https://mvnrepository.com/artifact/org.glassfish.jersey.core

答案 3 :(得分:-2)

您可以将tomcat版本更改为7,然后运行不需要更改pom.xml