java EE应用程序中的java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String()
我正在开发一个Java EE应用程序,其中需要Base64编码/解码 因此,我在应用程序的java EE应用程序中的java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String(),java,jakarta-ee,base64,Java,Jakarta Ee,Base64,我正在开发一个Java EE应用程序,其中需要Base64编码/解码 因此,我在应用程序的WEB-INF/lib文件夹中添加了commons-codec-1.5.jar,并使用 import org.apache.commons.codec.binary.Base64; 在Java文件中 在编译期间,当我键入Base64时,它显示encodeBase64String方法可用。但在运行时,它会引发如下异常: java.lang.NoSuchMethodError:org.apache.commo
WEB-INF/lib
文件夹中添加了commons-codec-1.5.jar
,并使用
import org.apache.commons.codec.binary.Base64;
在Java文件中
在编译期间,当我键入Base64
时,它显示encodeBase64String
方法可用。但在运行时,它会引发如下异常:
java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String
我在构建路径中有JAR,但我仍然不明白它为什么会抛出上述错误。该方法在Commons Codec 1.4中。此异常表示您在webapp的运行时类路径的其他地方有一个旧版本的Commons Codec,它在类加载中具有优先权。检查webapp的运行时类路径覆盖的所有路径。这包括Webapp/WEB-INF/lib
,YourAppServer/lib
,JRE/lib
和JRE/lib/ext
。最后删除或升级有问题的旧版本
更新:根据评论,您似乎找不到它。我只能建议使用较新的方法对代码进行注释,然后将以下行放在适当的位置:
System.out.println(Base64.class.getProtectionDomain().getCodeSource().getLocation());
它应该打印JAR文件的绝对路径,JAR文件在运行时从中加载
更新2:这似乎指向了正确的文件。对不起,我现在无法解释你的问题。我所能建议的就是使用不同的
Base64
方法,比如encodeBase64(byte[])
,然后自己构造一个新字符串(bytes)
。或者,您可以删除该库并使用不同的Base64编码器,例如。一些Google工具(如GWT)有一个嵌入式版本的commons编解码器,带有1.4之前的Base64类。您可能需要重构您的项目,使您的代码无法访问这些工具jar,以便只有代码中需要该工具的部分才能看到依赖关系。@Adam Augusta是正确的,还有一件事
ApacheHTTP客户端JAR也与一些谷歌API属于同一类别
org.apache.httpcomponents.httpclient_4.2.jar
和commons-codec-1.4.jar都在类路径上,这很可能会导致这个问题
这证明了所有JAR都在内部使用早期版本的通用编解码器,同时也有人在类路径上明确使用通用编解码器。在部署web应用程序时,我遇到了JBoss 4.2.3 GA的同样问题。通过将我的commons codec 1.6 jar复制到C:\jboss-4.2.3.GA\server\default\lib中,我解决了这个问题。在类路径中需要Apache commons codec库1.4或更高版本。 此库包含Base64实现。下载
它解决了我的问题,这是1.7。在使用org.apache.commons.codec.binary.Base64库时,只需创建一个Base64对象并使用它进行编码或解码 编码 Base64 ed=新的Base64() 字符串编码=新字符串(ed.encode(“Hello.getBytes()) 将“Hello”替换为要以字符串格式编码的文本 破译 Base64 ed=新的Base64() 已解码字符串=新字符串(ed.decode(encoded.getBytes())
此处encoded是要解码的字符串变量请尝试将“commons-codec-1.8.jar”添加到JRE文件夹中 感谢回复BalusC。我在整个系统中搜索了这个jar。我在系统中的任何地方都找不到任何旧jar。我所拥有的只是我的Webapp/WEB-INF/libI中的commons-codec-1.5.jar,它用一行代码更新了我的答案,这会让你进一步了解
Base64
类实际上是从哪里加载的运行时。@BalusC上面的System.out.printed以下文件:/C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps/Project_name/WEB-INF/lib/commons-codec-1.5.jar另一种确定所选类是否相同或不同的策略是使用反射打印所有Base64类的公共方法。@BalusC-I清理并构建了该项目。然后我将WAR部署到tomcat中。有趣的是,它开始正常工作。请参阅我关于java Post如何调用此方法的另一个问题。这解决了我的问题。我正在使用JBoss 5.1.0 GA并在此服务器上部署一个EAR。我需要一个项目中包含的api的commons编解码器1.6。JBoss服务器的lib文件夹中有一个commons codec 1.3 jar。我希望在ear中部署我的项目所需的所有LIB,否则会发生此错误。当我复制lib文件夹中的commons codec 1.6(旧的仍然存在)时,它可以工作。