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/lib
, YourAppServer/lib
, JRE/lib
和JRE/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.jar和commons-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