我们在 Adobe 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
后,将到达 Security.addProvider(new BouncyCastleProvider());
通过 PayConfiguration
,我们收到一个 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 的类加载器在这里做什么。我错过了什么?
最佳答案
老实说,我也不知道 Lucee 的类加载器在做什么,但是当通过 Lucee /lib
路径加载某些更复杂的 jar 时,这种错误似乎很常见。很可能某处正在发生“类(Class)冲突”。
Lucee 现在是基于 OSGi 的,这意味着避免这种情况的最佳方法是将第三方 java 库加载为 OSGi 包。一些库已经为 OSGi 打包,其他的可以很容易地转换。 More details here .
Amazon 库似乎不是 OSGi 友好的,尽管它可能不费吹灰之力就可以转换。
现在,我会查看 JavaLoader作为让它工作的最简单方法。我没有任何有效的亚马逊 key 来进行全面测试,但使用 JavaLoader 我至少能够调用 payConfig.setPrivateKey()
方法而不会出现 ClassNotFoundException
错误.
关于java - JAR 在 Lucee 上找不到 BouncyCaSTLeProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66037089/