Java Jersey应用程序启动时的NoSuchMethodError

尝试在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.(ApplicationHandler.java:304) at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:285) at org.glassfish.jersey.servlet.WebComponent.(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) 

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

这个错误通常意味着你在类路径上有一个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,那就有一个javax.ws.rs.core.Application在每个jar中。 但是jsr311-api Application没有方法getProperties() (因此NoSuchMethodError )。

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

  com.wordnik swagger-core_2.10 1.3.11   javax.ws.rs jsr311-api    

我们使用的是jersey-json 1.9,它依赖于jersey-core ,它也碰巧有一个javax.ws.rs.core.Application类。

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

   com.sun.jersey jersey-json 1.9   com.sun.jersey jersey-core    

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