在javax.ws.rs.core.MultivaluedMap.addAll获取java.lang.NoSuchMethodError

时间:2015-12-18 08:27:49

标签: java nosuchmethoderror

在以下调用

期间引发异常
Response response = client().target(rpTarget())
    .path(clusterPath())
    .queryParam("api-version", csmv2ApiVersion())
    .request(MediaType.APPLICATION_JSON)
    .get();

异常的完整堆栈是

java.lang.NoSuchMethodError: javax.ws.rs.core.MultivaluedMap.addAll(Ljava/lang/Object;[Ljava/lang/Object;)V
  at org.glassfish.jersey.client.ClientRequest.accept(ClientRequest.java:335)
  at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:221)
  at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:59)

...

我使用" mvn package"构建我的应用程序jar。并且构建输出具有以下

[INFO] Including javax.ws.rs:javax.ws.rs-api:jar:2.0.1 in the shaded jar.

[INFO] Including org.glassfish.jersey.core:jersey-common:jar:2.19 in the shaded jar.

我似乎正在使用似乎包含javax.ws.rs-api.jar方法定义的MultivaluedMap.addAll的最新版本,但我仍然不断获得此异常。

你可以告诉我我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

看起来您在编译时和运行时可能有不同版本的MultivaluedMap。因此,当使用maven时,您可以针对特定版本的库进行编译而没有错误,但是根据您编译它的方式,您实际上可能在运行时使用不同的版本(例如,内置于服务器中的版本)没有此方法,导致例外。检查服务器使用的版本,看看它与您在pom.xml中指定的版本之间是否存在差异。还要检查该依赖项的scope属性,默认情况下我认为是" compile"这实际上会将库编译到你的jar文件中,"提供"不会编译库,并期望通过其他方式提供它。

这里需要注意的重要一点是,编译时使用的库版本不一定与运行时使用的版本相同。如果您可以确保服务器上的版本是您想要的版本,而不是有两个不同的版本,那么它会使事情变得更容易。

参见2.3 here一节,它有一些关于glassfish所需的javax.ws.rs maven依赖关系的信息。