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)
Ответы
Ответ 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