Lucee上的JAR未找到BouncyCastleProvider
我们在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时,这种错误似乎相当常见。很可能在某个地方发生了阶级冲突。
Lucee现在是基于OSGi的,这意味着避免这种情况的最好方法是将第三方Java库作为OSGi包加载。一些库已经为OSGi打包,而其他库可以相当容易地进行转换。More details here。
Amazon库似乎不是OSGi友好的,尽管它很可能不需要太多努力就可以转换。
目前,我将JavaLoader视为使其工作的最简单方法。我没有任何有效的Amazon密钥来完全测试,但使用JavaLoader,我至少能够调用payConfig.setPrivateKey()
方法而不会收到ClassNotFoundException
错误。
相关文章