2012-03-05 65 views
3

在我的OSGi環境中,我試圖預加載數據庫驅動程序以供進一步使用。通常情況下,可以這樣做:OSGi Felix和BndTools - 按名稱加載類

Class.forName("com.mysql.jdbc.Driver"); 

之後,可以創建連接。但是,如果我在Felix的OSGi中使用它,他說該類無法找到(ClassNotFoundException),並且無法創建連接。但是,當我做這樣的事情(省略try-catch):

com.mysql.jdbc.Driver d = new com.mysql.jdbcDriver 
Class.forName("com.mysql.jdbc.Driver"); 

然後一切工作正常,並創建連接。但是,這不是很漂亮,因爲駕駛員級別不能交換。

有沒有辦法用第一種方法加載類?我假設我必須提供正確的類加載器。但我從哪裏得到?

MySQL驅動程序是作爲OSGi包裝程序包提供的。

+0

如果您的源代碼中包含類名,則永遠不需要使用Class.forName加載類動態類。只有通過運行時機制獲取類名時,才應該使用動態類加載。 – 2012-03-06 07:47:41

回答

4

您究竟如何創建捆綁清單?如果您使用工具自動解析捆綁包的OSGi導入語句,則它們將在第一個方法上失敗,因爲它們不會將簡單字符串識別爲程序包依賴性。第二種方法將依賴關係表示爲硬Java依賴關係,因此可以通過將必需的OSGi導入語句(並因此由OSGi運行時添加到您的包的類路徑)的工具來識別。

因此,對於您的第一種工作方法,您必須將依賴項添加到軟件包com.mysql.jdbc到您的軟件包的OSGi導入語句中。這是如何實現的工具特定的,Bnd使用Import-Statement配置參數。

3

@Heri在回答中說的一切都是正確的。但是如果你想在這個系統中引入更多的靈活性,使用OSGi服務

您想建立數據庫連接,但不希望將代碼與特定數據庫或JDBC驅動程序緊密耦合。爲什麼不寫一個發佈javax.sql.DataSource服務的小JDBC封裝包?然後,您的邏輯包可以在需要查詢數據庫時綁定到該服務,並且它不需要知道有關物理數據庫連接的任何信息。

請注意,JDBC包裝器捆綁包需要知道特定的JDBC驅動程序,但它將是一個非常細小的捆綁包,您可以爲您可能希望使用的每個驅動程序生成替代包裝器。