Java EE应用程序中的java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String()

Sre*_*ram 40 java base64 java-ee

我正在开发一个Java EE应用程序,我需要Base64编码/解码

所以我说commons-codec-1.5.jarWEB-INF/lib我的应用程序的文件夹,并用

import org.apache.commons.codec.binary.Base64;
Run Code Online (Sandbox Code Playgroud)

在Java文件中.

在编译期间,当我键入时Base64,它显示encodeBase64String方法可用.但是在运行时它会抛出这样的异常:

java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String
Run Code Online (Sandbox Code Playgroud)

我在buildpath中有JAR,但我仍然不明白为什么它会抛出我上面的错误.

Bal*_*usC 73

该方法是在Commons Codec 1.4中引入的.此异常表示您在webapp的运行时类路径中的其他位置有一个旧版本的Commons Codec,它在类加载中优先.检查webapp的运行时类路径所涵盖的所有路径.这包括除其他外Webapp/WEB-INF/lib,YourAppServer/lib,JRE/libJRE/lib/ext.最后删除或升级有问题的旧版本.


更新:根据评论,您似乎无法找到它.我只能建议使用更新的方法取消注释代码,然后将以下行放在适当的位置:

System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation());
Run Code Online (Sandbox Code Playgroud)

这应该打印到运行时加载的JAR文件的绝对路径.


更新2:这似乎指向正确的文件.对不起,我现在不能解释你的问题了.我所能建议的是使用不同的Base64方法encodeBase64(byte[]),然后new String(bytes)自己构建一个.或者你可以删除该库并使用不同的Base64编码器,例如这个.

  • 我用一个代码行更新了我的答案,这个代码行可以让你进一步了解在运行时实际加载`Base64`类的位置. (2认同)

Ada*_*sta 6

一些谷歌工具,如GWT,有一个嵌入式版本的commons-codec,带有1.4之前的Base64类.您可能需要通过重构项目使代码无法访问这些工具JAR,这样只有代码中需要该工具的部分才能看到依赖项.


小智 6

@Adam Augusta是对的,还有一件事

Apache-HTTP客户端jar也与google-apis属于同一类别.

类路径上的org.apache.httpcomponents.httpclient_4.2.jarcommons-codec-1.4.jar,这很可能会出现这个问题.

这证明了所有在内部使用早期版本的common-codec并且同时在classpath上明确使用common-codec的jar.