本文介紹了Lucee上的JAR未找到BouncyCastleProvider的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我們?cè)贏dobe ColdFusion中成功使用了AmazonPay API for Java(amazon-pay-api-sdk-java-2.2.2.jar
)。我們最近引入了Lucee(在Jetty上,也在OpenJDK 8上運(yùn)行),并嘗試運(yùn)行相同的代碼(相關(guān)摘錄):
payConfig = createObject("java", "com.amazon.pay.api.PayConfiguration").init();
payConfig.setPrivateKey("...");
但是,當(dāng)調(diào)用setPrivateKey
時(shí),將到達(dá)Security.addProvider(new BouncyCastleProvider());
到PayConfiguration
,我們收到一個(gè)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
我們已將所有依賴項(xiàng)(bcprov-jdk15on-1.65.jar
作為BouncyCastle)放在/lucee-server/context/lib
中。在.cfm/.cfc中創(chuàng)建BouncyCastleProvider
確實(shí)可以正常工作:
createObject("java", "org.bouncycastle.jce.provider.BouncyCastleProvider").init()
我不明白Lucee的類加載器在這里做什么。我錯(cuò)過(guò)了什么?
推薦答案
老實(shí)說(shuō),我也不知道Lucee的類加載器在做什么,但當(dāng)通過(guò)Lucee/lib
路徑加載某些更復(fù)雜的JAR時(shí),這種錯(cuò)誤似乎相當(dāng)常見(jiàn)。很可能在某個(gè)地方發(fā)生了階級(jí)沖突。
Lucee現(xiàn)在是基于OSGi的,這意味著避免這種情況的最好方法是將第三方Java庫(kù)作為OSGi包加載。一些庫(kù)已經(jīng)為OSGi打包,而其他庫(kù)可以相當(dāng)容易地進(jìn)行轉(zhuǎn)換。More details here。
Amazon庫(kù)似乎不是OSGi友好的,盡管它很可能不需要太多努力就可以轉(zhuǎn)換。
目前,我將JavaLoader視為使其工作的最簡(jiǎn)單方法。我沒(méi)有任何有效的Amazon密鑰來(lái)完全測(cè)試,但使用JavaLoader,我至少能夠調(diào)用payConfig.setPrivateKey()
方法而不會(huì)收到ClassNotFoundException
錯(cuò)誤。
這篇關(guān)于Lucee上的JAR未找到BouncyCastleProvider的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,