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] 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)
注意:请参阅以上评论以获取进一步的讨论和提示。
此错误通常意味着您在类路径上同时拥有 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>
您可以将 tomcat 版本更改为 7 然后 运行 无需更改 pom.xml
我们正在使用 jersey-json
1.9,它依赖于 jersey-core
,后者恰好也有 javax.ws.rs.core.Application
class。
所以我们的解决方法是从 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>
问题与 "com.sun.jersey:jersey-core:jar:1.18.3"(或任何 1.* 版本)有关,因为 Jersey 的旧版本没有 "public Map getProperties()" 方法。
并且您的依赖项之一使用 Jersey 版本 1(您可以在 运行 mvn dependency:tree 中检查并搜索所有使用的 jersey-core 版本)
我已经解决了删除所有 com.sun.jersey 依赖项(旧的 api)并使用新的 org.glassfish.jersey API
的问题
https://mvnrepository.com/artifact/org.glassfish.jersey.core
我在 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] 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)
注意:请参阅以上评论以获取进一步的讨论和提示。
此错误通常意味着您在类路径上同时拥有 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>
您可以将 tomcat 版本更改为 7 然后 运行 无需更改 pom.xml
我们正在使用 jersey-json
1.9,它依赖于 jersey-core
,后者恰好也有 javax.ws.rs.core.Application
class。
所以我们的解决方法是从 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>
问题与 "com.sun.jersey:jersey-core:jar:1.18.3"(或任何 1.* 版本)有关,因为 Jersey 的旧版本没有 "public Map getProperties()" 方法。
并且您的依赖项之一使用 Jersey 版本 1(您可以在 运行 mvn dependency:tree 中检查并搜索所有使用的 jersey-core 版本)
我已经解决了删除所有 com.sun.jersey 依赖项(旧的 api)并使用新的 org.glassfish.jersey API
的问题https://mvnrepository.com/artifact/org.glassfish.jersey.core