在以下调用
期间引发异常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
的最新版本,但我仍然不断获得此异常。
答案 0 :(得分:3)
看起来您在编译时和运行时可能有不同版本的MultivaluedMap。因此,当使用maven时,您可以针对特定版本的库进行编译而没有错误,但是根据您编译它的方式,您实际上可能在运行时使用不同的版本(例如,内置于服务器中的版本)没有此方法,导致例外。检查服务器使用的版本,看看它与您在pom.xml中指定的版本之间是否存在差异。还要检查该依赖项的scope属性,默认情况下我认为是" compile"这实际上会将库编译到你的jar文件中,"提供"不会编译库,并期望通过其他方式提供它。
这里需要注意的重要一点是,编译时使用的库版本不一定与运行时使用的版本相同。如果您可以确保服务器上的版本是您想要的版本,而不是有两个不同的版本,那么它会使事情变得更容易。
参见2.3 here一节,它有一些关于glassfish所需的javax.ws.rs maven依赖关系的信息。