【问题标题】:NoSuchMethodError: org.apache.commons.codec.binary.Base64.(I)V at org.apache.http.impl.auth.BasicScheme.(BasicScheme.java:65)NoSuchMethodError:org.apache.commons.codec.binary.Base64.(I)V at org.apache.http.impl.auth.BasicScheme.(BasicScheme.java:65)
【发布时间】:2014-07-19 01:11:50
【问题描述】:

即使我没有使用 Base64,也会发生这种情况。

我确实在 Glassfish 中我的域的 lib 目录中引用了 commons-codec-1.9,并且在 httpclient-4.3.4 和 lib 目录中也引用了导致错误的代码。

    try {
        Authenticator.setDefault(new Authenticator()
        {
            @Override
            protected PasswordAuthentication getPasswordAuthentication()
            {
                return new PasswordAuthentication("myusername", "mypassword".toCharArray());
            }
        });

        String xmlRequestString = formatXMLRequest((Exception) exception);

        HttpClient client = HttpClientBuilder.create().build();

        HttpPost post = new HttpPost("http://mysite.org/post.xml");

        StringEntity entity = new StringEntity(xmlRequestString);
        entity.setContentType("text/xml");

        post.setEntity(entity);

        client.execute(post); // <--- HERE is where the error is thrown
    } catch (Exception ex) {
        Logger.getLogger(LogManagerBean.class.getName()).log(Level.SEVERE, null, ex);
    }

有什么想法吗?

【问题讨论】:

  • 当您在构建路径中使用第三方 jar 的一个版本编译代码,并在库路径中使用该 jar 的不同版本运行代码时,通常会发生此错误。
  • 是的,我想到了。我非常小心地确保它不是。我从 Glassfish 中取消部署我的耳朵,停止 glassfish,摆脱旧版本,将新版本放在 lib 目录中,删除所有缓存,重新启动 glassfish,并在构建完所有内容后重新部署。还是被难住了。
  • 但是您在构建路径中使用的是相同版本的 jar 吗?
  • 没有。我正在使用 Maven,我的命令行路径中没有任何特定的库。 Maven 声明构建版本。 Glassfish 域库具有运行版本。它们是一样的。

标签: java post glassfish httpclient apache-commons


【解决方案1】:

这是一个二进制兼容性问题,它是由您的 web 应用程序的有效类路径中存在不兼容的库引起的。具体来说,包含BasicScheme 类的JAR 文件与包含Base64 类的JAR 文件不兼容。前者包含对类加载器找到的后者版本中不存在的方法的调用。

即使我没有使用 Base64,也会发生这种情况。

是的。但是BasicScheme 类 >>issomething 使用该类。


签名org.apache.commons.codec.binary.Base64.(I)V 指的是一个接受int 参数的构造函数。根据 GrepCode,自 1.4 版以来的所有版本的 Apache Commons Codec 都有这个构造函数。但是 1.3 版没有。因此,请在您的应用服务器中查找“commons-codec”JAR 文件的旧副本。

请注意,如果 web 应用程序(或其他)在其类路径中具有多个版本的库,则在类路径中较早的 JAR 文件中的版本

【讨论】:

    【解决方案2】:

    您似乎与commons-codes 库有冲突。例如,您的类路径中同时存在库 1.2 和 1.9,已发生错误签名,与不同版本中的类构造函数重载有关

    【讨论】:

      【解决方案3】:

      对我来说,当我从类路径中删除 jar(documentum jar) 时,它就解决了,其中又包含旧版本的编解码器。因此,可能会查看您的类路径并尝试查找是否有任何冲突,这会覆盖您的 codec-1.9

      【讨论】:

        猜你喜欢
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-28
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 2016-02-09
        相关资源
        最近更新 更多