我正在使用他们的Java库将GoCardless实现到我的ColdFusion应用程序中,并遇到以下错误:
java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.encodeBase64String([B] Ljava / lang / String;
正如GoCardless文档中所解释的,他们的库依赖于Apache Commons Codec库(以及其他)。当我将GoCardless JAR放入我的ColdFusion lib文件夹时,我注意到Apache Commons Codec JAR已经存在,所以我不确定这个错误意味着什么。
非常感谢任何帮助。谢谢!
答案 0 :(得分:3)
假设您没有调用该方法,它可能意味着它所说的内容。 jvm加载的编解码器版本不包含具有该签名的方法。您可以通过创建org.apache.commons.codec.binary.Base64
类的实例并使用cfdump检查可用方法来验证它。 (可能也是类加载器冲突,但前者更有可能。)
就原因而言,当类路径中存在多个版本的jar时,jvm只能选择其中一个版本。它可能选择了ColdFusion附带的旧版本,可能没有这种方法。见:Identifying which jar a class was loaded from..。
加载较新jar版本的最简单方法是删除/lib
中的旧jar,将其替换为较新版本,然后重新启动CF.请记住,CF本身也使用库,因此如果较新版本不向后兼容,则存在破坏某些内容的风险。另一种选择是使用CF10的dynamic class loading feature。它基本上只是Mark Mandel's JavaLoader.cfc的一小部分,只是捆绑在CF中。