2013-03-25 75 views
2

我一直在開發OSGi模塊,但到目前爲止,當我必須包裝現有的罐子時,我遇到了很多問題。一個例子是使用Oracle數據庫驅動程序,儘管我已經將該jar包裝爲捆綁包,但仍然拒絕工作(即使它存在也找不到該驅動程序類)。這只是一個例子,但我與其他第三方庫存在問題,並想知道是否有最佳實踐方法來使用第三方庫,這些庫每次都有效?一致的OSGi導入第三方庫

Jlove

回答

0

你的情況的問題是,jdbc使用java運行庫中的類來查找數據庫驅動程序(DriverManager.getConnection)。這不能工作,因爲數據庫驅動程序無法從系統類加載器(加載DriverManager類)訪問。

OSGi中的一種方式是使用DataSource代替:http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html。你只需使用new創建數據源,這當然是可行的。問題是它使你的用戶包依賴於特定的數據庫驅動程序。所以最好的做法是集中創建DataSource並將其作爲服務發佈。

你可以在我的Apache Karaf DB教程(http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access)中找到更多的細節。

Btw。一般來說,這類工廠在圖書館OSGi失敗的地方是有效的。每個lib創建另一個不同的工廠系統,其中大部分與OSGi的受限類加載器不兼容。幸運的是,現在大部分庫都已經做好了OSGi的準備。大多數情況下,這僅僅意味着你也可以用一個可以使用OSGi服務檢索的具體對象來調用工廠。

+0

感謝您的信息...我發現它非常有幫助 – JLove 2013-03-27 08:58:19

0

我的首選的方法是不換行庫中,但將其unjar,添加一個清單,並重新罐子它。罐子裏面的罐子往往會導致難以調試的問題。通過一個簡單的ant腳本可以實現unjar和re-jar的自動化。

另外,我喜歡手動編寫MANIFEST.MF。如果被封裝的庫很小,那麼很容易做到這一點。像bnd這樣的爲你生成MANIFEST.MF的工具並不總是給出正確的結果,如果你依賴它們太多,你不知道底下發生了什麼。

+0

感謝您的反饋,您能否告訴我該解決方案是否按照上面的示例使用Oracle驅動程序工作?我使用eclipse嚮導來打包現有的jar文件,該jar文件將jar作爲過程的一部分進行提取,因此我不確定它會以不同的結果結束 – JLove 2013-03-25 21:12:39

+0

不確定,我之前在OSGi上下文中使用過Oracle庫,沒有太多問題。你想發佈eclipse生成的MANIFEST.MF嗎? – amarillion 2013-03-25 22:06:54

+0

儘管明天會做...。謝謝 – JLove 2013-03-25 22:15:46