This question already has answers here:
NoSuchMethodError: MultivaluedMap.addAll in Jersey Client
                                
                                    (3个答案)
                                
                        
                                3年前关闭。
            
                    
在下一次调用期间引发异常

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包”构建应用程序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方法的定义,但是我仍然不断收到此异常。

你能让我知道我在想什么吗?

最佳答案

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

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

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

09-05 00:49