JAR 在 Lucee 上找不到 BouncyCastleProvider

BouncyCastleProvider not found by JAR on Lucee

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

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.access0(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 的类加载器在这里做什么。我错过了什么?

老实说,我也不知道 Lucee 的 classloader 在做什么,但是当通过 Lucee /lib 路径加载某些更复杂的 jar 时,这种错误似乎很常见.很可能某处正在发生“class 冲突”。

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

Amazon 库似乎不是 OSGi 友好的,尽管它可能不费吹灰之力就可以转换。

目前,我认为 JavaLoader 是使其正常工作的最简单方法。我没有任何有效的亚马逊密钥来进行全面测试,但使用 JavaLoader 我至少能够调用 payConfig.setPrivateKey() 方法而不会出现 ClassNotFoundException 错误。