本文介紹了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
錯誤。
這篇關于Lucee上的JAR未找到BouncyCastleProvider的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,