在 Java Jersey 应用程序中启动时出现 NoSuchMethodError [英] NoSuchMethodError on startup in Java Jersey app
问题描述
尝试在 Tomcat 上启动 Jersey 应用程序时,我遇到了一个非常奇怪的错误.相同的代码适用于其他计算机.我尝试重新安装 tomcat,我所有的 maven 依赖项,甚至 Eclipse 和 Java 本身,但没有运气.似乎正在加载一个糟糕的 Jersey 版本,我想?
任何指向正确方向的指针将不胜感激.
这是有效的 pom:http://pastebin.com/NacsWTjz
和实际的 pom:http://pastebin.com/H6sHe4ce
2015-02-13 13:43:40,870 [localhost-startStop-1] 错误 org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/middleware-server] - StandardWrapper. 可投掷java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;在 org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:304)在 org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:285)在 org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)在 org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:170)在 org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358)在 javax.servlet.GenericServlet.init(GenericServlet.java:158)在 org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)在 org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)在 org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)在 org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4901)在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5188)在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)在 java.util.concurrent.FutureTask.run(FutureTask.java:266)在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)在 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,每个 jar 中有一个 javax.ws.rs.core.Application
.但是 jsr311-api
Application
没有方法 getProperties()
(因此是 NoSuchMethodError
).>
我得出的结论是,您需要做的就是将上述排除项添加到 swagger 依赖项中.Jackson 2.0 提供程序(取决于 JAX-RS 1)似乎被 2.4.1 提供程序(使用新版本)覆盖.所以我们不需要自己添加.当它被覆盖时,它似乎留下了 jsr311-api.jar
.所以如果我们排除它,没有人可以尝试使用它,这看起来是当前的问题
<依赖><groupId>com.wordnik</groupId><artifactId>swagger-core_2.10</artifactId><version>1.3.11</version><排除事项><排除><groupId>javax.ws.rs</groupId><artifactId>jsr311-api</artifactId></排除></排除项></依赖>
I've been getting a very strange error when trying to start a Jersey app on Tomcat. The same code works on other computers. I tried reinstalling tomcat, all my maven dependencies, even Eclipse and Java itself, no luck. It seems like a bad Jersey version is being loaded, I think?
Any pointers in the right direction will be appreciated.
Here's the effective pom: http://pastebin.com/NacsWTjz
And the actual 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)
Note: Please see above comments for further discussion and tips.
This error usual means that you have a both a JAX-RS 1 and JAX-RS 2 jar on the classpath. Jersey 2 uses JAX-RS 2 (javax.ws.rs-api-2.0.1.jar
), but if you have the jsr311-api.jar
also, which is JAX-RS 1, there is a javax.ws.rs.core.Application
in each jar. But the jsr311-api
Application
doesn't have the method getProperties()
(hence NoSuchMethodError
).
I've come to the conclusion that all you need to do is add the above exclusion to the swagger dependency. The Jackson 2.0 provider (which depends on JAX-RS 1) seems to be overridden by a 2.4.1 provider (which uses the new version). So we don't need to add it ourselves. When it's overridden, it seems to leave behind the jsr311-api.jar
. So if we exclude it, no one can attempt to use it, which looks to be the current problem
<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>
这篇关于在 Java Jersey 应用程序中启动时出现 NoSuchMethodError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!