Подтвердить что ты не робот

NoSuchMethodError при запуске в приложении Java Jersey

У меня возникла очень странная ошибка при попытке запустить приложение "Джерси" на Tomcat. Тот же код работает на других компьютерах. Я попытался переустановить 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)
4b9b3361

Ответ 1

Примечание: Пожалуйста, см. выше комментарии для дальнейшего обсуждения и советов.

Эта ошибка обычно означает, что у вас есть как JAX-RS 1, так и JAX-RS 2 на пути к классам. Джерси 2 использует JAX-RS 2 (javax.ws.rs-api-2.0.1.jar), но если у вас есть и jsr311-api.jar, то есть JAX-RS 1, в каждой банке есть 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>

Ответ 2

Мы используем jersey-json 1.9, который имеет зависимость от jersey-core который также имеет класс javax.ws.rs.core.Application.

Поэтому наше исправление заключается в исключении джерси-ядра из jersey-json:

    <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>

Ответ 3

Вы можете изменить версию tomcat на 7, тогда не будет необходимости изменять pom.xml