【问题标题】:BouncyCastleProvider not found by JAR on LuceeJAR 在 Lucee 上找不到 BouncyCastleProvider
【发布时间】:2021-05-08 05:59:22
【问题描述】:

我们已在 Adob​​e ColdFusion 中成功使用 AmazonPay API for Java (amazon-pay-api-sdk-java-2.2.2.jar)。我们最近介绍了 Lucee(在 Jetty 上,也在 OpenJDK 8 上运行)并尝试运行相同的代码(相关摘录):

payConfig = createObject("java", "com.amazon.pay.api.PayConfiguration").init();
payConfig.setPrivateKey("...");

但是,在致电setPrivateKey(将通过PayConfiguration 到达Security.addProvider(new BouncyCastleProvider());)时,我们会收到java.lang.ClassNotFoundException

lucee.runtime.exp.NativeException: org.bouncycastle.jce.provider.BouncyCastleProvider
  at com.amazon.pay.api.PayConfiguration.setPrivateKey(PayConfiguration.java:77)
  [...]
  at java.lang.Thread.run(Thread.java:823)
 Caused by: java.lang.NoClassDefFoundError: org.bouncycastle.jce.provider.BouncyCastleProvider
  ... 57 more
 Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider not found by amazon.pay.api.sdk.java.2.2.2 [49]
  at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1597)
  at org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
  at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1982)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:881)
  ... 57 more

我们已将所有依赖项(bcprov-jdk15on-1.65.jar 是 BouncyCastle)放在 /lucee-server/context/lib 中。在 .cfm/.cfc 中创建 BouncyCastleProvider 确实可以按预期工作:
createObject("java", "org.bouncycastle.jce.provider.BouncyCastleProvider").init()

我不明白 Lucee 的类加载器在这里做什么。我错过了什么?

【问题讨论】:

  • 我在他们的 Github 存储库或 mvn 上找不到亚马逊 jar 的 2.2.2 版本。当前版本是 3.6.5,似乎可以与 Lucee 一起使用(来自一个非常快速的测试)。
  • 您使用的是哪个版本的 Lucee 和 ColdFusion?
  • @CfSimplicity Release on GitHubon Maven。我尝试了 Lucee 版本 5.3.7.475.3.8.139-RC。您提到的版本是“旧”的 Amazon Pay API v1。
  • 啊,抱歉。我刚刚搜索了“amazon pay java”,结果就是这样。

标签: java coldfusion bouncycastle apache-felix lucee


【解决方案1】:

老实说,我也不知道 Lucee 的类加载器在做什么,但是当通过 Lucee /lib 路径加载某些更复杂的 jar 时,这种错误似乎很常见。很可能在某个地方发生了“阶级冲突”。

Lucee 现在是基于 OSGi 的,这意味着避免这种情况的最佳方法是将第三方 Java 库加载为 OSGi 包。一些库已经为 OSGi 打包,而另一些库可以很容易地转换。 More details here.

Amazon 库似乎对 OSGi 不友好,尽管它可能无需太多努力就可以转换。

目前,我认为JavaLoader 是让它工作的最简单方法。我没有任何有效的 Amazon 密钥来进行全面测试,但使用 JavaLoader 我至少能够调用 payConfig.setPrivateKey() 方法而不会收到 ClassNotFoundException 错误。

【讨论】:

  • 非常有趣的博客文章。这有助于我更多地理解这个问题。我最终用Class-Path: bcprov-jdk15on-1.68.jar commons-beanutils-1.9.4.jar commons-collections-3.2.2.jar ezmorph-1.0.6.jar json-lib-2.4-jdk15.jar 修改了Amazon Pay JAR 中的MANIFEST.MF,并将提到的依赖项放在了Lucee 的lib 文件夹中。现在一切都在 Lucee 中运行,它也适用于 ColdFusion 服务器。虽然这不是一个优雅的解决方案。编译源和目标包可能是 Lucee 的正确解决方案。
  • 很高兴你让它工作了,虽然我只是担心通过lib 路径加载。对我来说,Lucee 感觉“正确”的解决方案是 OSGi 捆绑方法,您也可以通过打包依赖项和修改 MANIFEST.MF 来实现。对于 ACF 交叉兼容,JavaLoader 是我的首选。
  • 更新:我最终将 BouncyCastle 降级为 ColdFusion10 附带的版本(调整亚马逊源代码并重新编译)。只是没有可靠的方法让它同时适用于两个 CFML 引擎,因为它与旧版本的 Lucee 再次发生故障。这仍然是一个可怕的解决方案。 :(
  • 你试过 JavaLoader 了吗?
  • 我先做了,但这也给最新版本的 BouncyCastle 带来了麻烦。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多