我知道這是一個常見問題,但創建一個新的線程,以防萬一某人像我一樣卡住,即使嘗試了一些文檔中已經解釋的選項。OSGi ClassNotFoundException加載數據庫驅動程序時
我已經部署了一個osgi包(Say Bundle B),它具有與數據層訪問相關的所有代碼。基本上,當訪問這個包中的服務方法時,它只會首次創建一個JDBC連接,方法是加載驅動程序。該驅動程序被部署爲另一個包裝的sqljdbc 4.0包。 (Say Bundle C)
現在我有Bundle TestApp(Say Bundle A),它從Bundle B創建上述服務方法的一個實例。所以這裏的流程是Bundle一個代碼創建一個Bundle B的導出服務實例,它在打開訪問Bundle C的Driver類。
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver not found by DataServices [417]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
單個類加載器在這裏做出了問題,但如何克服這裏的情況對我來說。我嘗試添加DynamicImport-Package以捆綁A,B,嘗試創建一個片段捆綁包,在此處展開https://gist.github.com/rotty3000/1291842,但仍然是相同的異常。繼續。
如果有人遇到過這樣的問題,如果你能夠一步一步地給我擺脫這個問題,那將是一個很大的幫助。
預先感謝您和所有新年快樂。
你有什麼代碼在你的包(只顯示相關的行)。它在發生異常的地方做了什麼? –
從Bundle A,PremiumService service = new PremiumServiceImpl();來自Bundle B的PremiumServiceImpl,dao.getJdbcConnection(),它反過來調用Class.forName(),從Bundle C,sqljdbc4-4.jar這是一個包裝的包 –
當我在這一行調試應用程序Class.forName(driverClassName) ,類加載器是捆綁類加載器,捆綁包作爲捆綁包A的名稱,而這行代碼位於捆綁B(DataServices)項目中。驅動程序類名稱值也被確認爲正確。 –