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

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

所以我在我的应用程序的WEB-INF/lib文件夹中添加了commons-codec-1.5.jar并使用

 import org.apache.commons.codec.binary.Base64; 

在Java文件中。

在编译期间,当我键入Base64 ,它显示encodeBase64String方法可用。 但是在运行时它会抛出一个像这样的exception:

 java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String 

我在构buildpath中有JAR,但是我仍不明白为什么会抛出上述错误。

该方法在Commons Codec 1.4中引入 。 这个exception表明你已经在webapp的运行时类path的其他地方有一个旧版本的Commons Codec,它在类加载中有优先权。 检查webapp的运行时类path覆盖的所有path。 其中包括Webapp/WEB-INF/libYourAppServer/libJRE/libJRE/lib/ext 。 最后删除或升级有问题的旧版本。


更新 :根据评论,你似乎无法find它。 我只能build议使用新的方法取代注释,然后放置下面的代码:

 System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation()); 

这应该在运行时打印到JAR文件的绝对path。


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

一些Google工具(如GWT)拥有embedded式版本的commons-codec,其中包含1.4以前的Base64类。 您可能需要通过重构项目来使这些工具JAR无法访问您的代码,从而只有需要该工具的代码部分才能看到依赖关系。

亚当·奥古斯塔是对的,还有一件事

Apache-HTTP客户端jar子也与某些google-apis类似。

org.apache.httpcomponents.httpclient_4.2.jarcommons-codec-1.4.jar都在classpath上,这很可能会导致你遇到这个问题。

这certificate了所有使用早期版本的通用编解码器的jar子,同时也有人在类path上显式使用通用编解码器

在部署我的Web应用程序时,我遇到了与JBoss 4.2.3 GA相同的问题。 我通过将我的commons-codec 1.6 jar复制到C:\ jboss-4.2.3.GA \ server \ default \ lib中解决了这个问题

您的类path中需要Apache Commons Codec库 1.4或更高版本。 这个库包含Base64实现。

下载这个jar

它解决了我的问题,这是1.7。

使用org.apache.commons.codec.binary.Base64库时,只需创build一个Base64对象并使用它来进行编码或解码

编码

Base64 ed = new Base64();

String encoded = new String(ed.encode(“Hello”.getBytes()));

将“Hello”replace为string格式的文本。

解码

Base64 ed = new Base64();

String encoded = new String(ed.decode(encoded.getBytes()));

这里编码是要被解码的stringvariables