java.lang.NoSuchMethodError:javax / ws / rs / core / MultivaluedMap.addAll

时间:2019-07-03 14:50:29

标签: java

我正在使用所有最新的jar和Java 8和Java EE 6版本,获得java.lang.NoSuchMethodError

尝试使用jersey-client-2.27.jar2.262.28版本,但仍然存在相同的问题,甚至检查了该方法在相应的jar中是否可用。

    Client client = ClientBuilder.newClient();
    WebTarget sendWT = client.target(blueMailUrl);

    Invocation.Builder builder = sendWT
        .request(MediaType.APPLICATION_JSON)
        .header(
            "Authorization", 
            "Basic " + DatatypeConverter.printBase64Binary((byte[]) (blueMailUserid + ":" + blueMailPassword).getBytes("UTF-8"))
        );

它不应引发此错误。

1 个答案:

答案 0 :(得分:1)

最有可能在类路径中位于jersey-jar前面的其他jar中包含较旧版本的MultivaluedMap。

在代码中添加以下行(在发生错误之前)

System.out.println(getClass().getClassLoader().getResource("javax/ws/rs/core/MultivaluedMap.class"));

这将输出找到该类的位置,类似

jar:file:/D:/myide/workspace/MyProject/lib/jars/someotherlibrary.jar!/javax/ws/rs/core/MultivaluedMap.class

要解决这个问题,取决于上述调用的实际结果,整个过程称为Jar-Hell。它可以在您的IDE中使用,因为在那里设置的类路径似乎与运行应用程序时设置的类路径不同。

编辑(因为现在知道位置):EE6的j2ee.jar包含一个不带addAll方法的MultvaluedMap,并且因为j2ee.jar似乎位于jersey-jar之前的类路径中。如NoSuchMethodError: MultivaluedMap.addAll in Jersey Client中所述,解决方案是使用Jersey 1.8或J2EE7。另一个未讨论的解决方案是完全不使用j2ee.jar,而只使用您实际使用的子项目的jar。如果只使用Activation.jar和javamail.jar来发送邮件等。