2010-04-25 12 views
6

這是一個biggie。JDBC/OSGi以及如何動態加載驅動程序而不顯式聲明包中的依賴關係?

我有具有原始模塊化結構(所有模塊實現接口還共享相同的類路徑)結構良好的又單片代碼庫。我意識到這種方法的愚蠢以及它在我部署到可能具有不同版本的庫的應用程序服務器時所表示的問題。

我現在正依賴於各地的30瓶和我中途雖然bnding起來。現在我的一些模塊很容易宣告版本化的依賴關係,比如我的網絡組件。他們在JRE和其他BNDded庫中靜態引用類,但是我的JDBC相關組件通過Class.forName(...)實例化並可以使用任意數量的驅動程序之一。

我對服務區打破一切成OSGi包。

  • 我的核心類/接口。
  • 報告相關組件。
  • 數據庫訪問相關組件(通過JDBC)。
  • 等....

我希望我的代碼能夠仍然沒有OSGi的通過與我所有的依賴關係,並沒有OSGi的所有(通過JARJAR)一個jar文件裏使用,也可以是模塊化的通過OSGi元數據和粒度束以及依賴信息。

  • 如何配置我的包和 我的代碼,以便它可以 動態地利用在 類路徑和/或OSGi的 容器環境 內的任何驅動程序(菲利克斯/春分的/ etc。)?

  • 是否有運行時方法來檢測我是否在跨容器兼容的OSGi容器(Felix/Equinox等)中運行?

  • 我需要使用不同的類加載機制,如果我在一個OSGi容器?

  • 我是否需要OSGi的類導入到我的項目能夠通過我的數據庫模塊加載在束時間未知的JDBC驅動程序?

  • 我還有第二種獲得驅動程序的方法(通過JNDI,它只適用於在應用程序服務器中運行時),是否需要爲支持OSGi的應用程序服務器更改我的JNDI訪問代碼?

回答

7
  • 利用OSGi環境內的任何驅動程序,你需要使用DynamicImport-包:*語句,所以當你載入一個的Class.forName(..)驅動程序捆綁軟件可以解決這些軟件包。
  • 可能最簡單的方法是嘗試訪問org.osgi.framework包中的類。那些應該至少總是在OSGi環境中(請參閱下面的代碼片段)。有更復雜的機制,所以讓我知道你是否需要更先進的東西。此外,請參閱OSGi R4.2核心規範,第3.8.9節,其中顯示了一些查找類的Bundle和BundleContext的方法,因此間接幫助確定您是否在框架中。
  • 這取決於你在做什麼,這裏沒有通用的「是」或「否」的答案。 OSGi使用類加載器,並且對標準Java應用程序不是「典型的」,但是根據你在做什麼,你可能不會注意到。
  • 看看最近發佈的OSGi企業規範。他們有關於OSGi中JNDI集成的章節,它可能允許您保留您的代碼(大部分)未經修改。

一個簡單的例子片斷:

public static boolean inOSGi() { 
    try { 
    Class.forName("org.osgi.framework.FrameworkUtil"); 
    return true; 
    } 
    catch (ClassNotFoundException e) { 
    return false; 
    } 
} 

只要確保你,如果你在一個包把這個代碼,捆綁應導入org.osgi.framework(否則將永遠找不到那個類) 。

+0

感謝您的信息,尤其是DynamicImport-套餐:*端頭,它令人驚訝的我無法通過互聯網搜索發現。 關於第二個答案,如果你有時間,一個片段可能會很好。無論如何,我會將此標記爲已批准的答案,但請回答我的主要問題。 謝謝。 – Chris 2010-04-30 00:35:49

0

我在Eclipse RCP做了一個JDBC驅動程序經理OSGI,我將帶您如何發揮好與OSGI。首先,忘記DynamicImport-Package,使用OSGI的唯一好方法是安裝/啓動/停止bundle並按照設計的方式使用OSGI機制。

  1. 你有你的JDBC包,並創建具有DriverClass,連接邏輯的初始化的另一個「驅動程序包」,並增加了必要的公共庫,比如dbcp2和POOL2。

  2. 出口驅動程序包爲JAR/ZIP,包括在你的JDBC包作爲一種資源。

  3. 讓你的JDBC包解壓在其工作區中的驅動程序包。

    String workdir= Platform.getStateLocation(jdbc_bundle).toPortableString(); 
    
  4. 編程方式添加驅動器罐並修改相應的驅動程序包的MANIFEST.MF文件。

  5. 負荷工作區域編程驅動器包

    getBundleContext().installBundle("file:/"+workdir); 
    
  6. 使用bundle.start(),停止(),卸載()時,根據需要以編程方式修改驅動程序的列表。

0

的PAX-JDBC可用於通過聲明的方式來委託數據源,意味着你可以創建ConfigAdmin服務一個配置項和數據源可以通過JNDI訪問。 JDBC驅動程序作爲捆綁包進行部署。 (大多有OSGi的版本)

例如:

Config項PID是org.ops4j.datasource測試

屬性:

osgi.jdbc.driver.name=H2 
databaseName=test 
user=sa 
password= 
dataSourceName=testds-h2 

該服務是由識別給定dataSourceName。所以你可以用(&(objectClass = javax.sql.DataSource)(dataSourceName = test2))進行篩選。

並且你可以通過JNDI訪問數據源:

osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=test2) 
相關問題