2017-01-16 41 views
0

我知道這是一個常見問題,但創建一個新的線程,以防萬一某人像我一樣卡住,即使嘗試了一些文檔中已經解釋的選項。OSGi ClassNotFoundException加載數據庫驅動程序時

我已經部署了一個osgi包(Say Bundle B),它具有與數據層訪問相關的所有代碼。基本上,當訪問這個包中的服務方法時,它只會首次創建一個JDBC連接,方法是加載驅動程序。該驅動程序被部署爲另一個包裝的s​​qljdbc 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,但仍然是相同的異常。繼續。

如果有人遇到過這樣的問題,如果你能夠一步一步地給我擺脫這個問題,那將是一個很大的幫助。

預先感謝您和所有新年快樂。

+0

你有什麼代碼在你的包(只顯示相關的行)。它在發生異常的地方做了什麼? –

+0

從Bundle A,PremiumService service = new PremiumServiceImpl();來自Bundle B的PremiumServiceImpl,dao.getJdbcConnection(),它反過來調用Class.forName(),從Bundle C,sqljdbc4-4.jar這是一個包裝的包 –

+0

當我在這一行調試應用程序Class.forName(driverClassName) ,類加載器是捆綁類加載器,捆綁包作爲捆綁包A的名稱,而這行代碼位於捆綁B(DataServices)項目中。驅動程序類名稱值也被確認爲正確。 –

回答

1

驅動程序方法在OSGi中運行不正常。而是使用數據源。 見example at msdn。你可以簡單地使用new創建一個數據源。這可以避免任何類加載問題。

如果你想從實際的DB提供者分離,那麼你可以使用OSGi jdbc規範,它定義了數據庫提供者應該公開一個可以爲你創建數據源的DataSourceFactory。

Pax-jdbc支持大規模數據庫提供者的這個規範。它允許有一個pax-jdbc-config模塊,它允許使用一個配置創建一個作爲OSGi服務的數據源。所以在你的代碼中你可以注入服務並完成。此外,pax-jdbc-config還可以關注池並使DataSource XA可以被感知。所以它產生了一個完全生產就緒的DataSource。

+0

謝謝基督徒,讓我試試這個選項。 –

+0

Pax-jdbc,我看到很多DB支持,但看不到SQLServer。這是我們必須使用Generic Driver Extender嗎? –

+0

有一個mssql模塊。 https://github.com/ops4j/org.ops4j.pax.jdbc/tree/master/pax-jdbc-mssql。它是0.6.0以來的版本的一部分 –

相關問題