2015-04-24 84 views
0

我有一些主要處理接口的bundle,它使用第三方jar中的工廠來獲取它正在使用的接口的實例。 例如,Apache Karaf中的強制導入

我-bundle.jar有...

com.oth.itf.Intrface itf = Fctry.getInstance('ABC'); 

imports-package for com.oth.itf 

第三party.jar有..

public static com.oth.itf.Intrface getInstance(String abc) { 
    if (...) { 
     return new com.oth.impl.ItfInstance(); 
    } 
} 

exports-package for com.oth.itf and com.oth.impl

一切工作正常和捆綁也得到部署,但問題是,我得到

的ClassNotFoundException爲ItfInstance

我 - 捆綁

代碼被執行時3210

我試着爲com.oth.impl添加import-package,但無濟於事。事情開始工作時,我在-bundle.jar添加com.oth.impl.ItfInstance

一些

其中

假聲明。看起來,卡拉夫只有在明確使用它們的情況下才能獲得進口產品。有沒有更好的辦法?即使我們沒有明確地使用它們,是否有辦法強制Karaf導入包裹?

+0

不,這不是如何進口OSGi工作。導入是導入,沒有「強制」選項。由於沒有張貼清單,因此無法分辨您的示例中發生了什麼問題。 –

+0

嗯,我沒有示例,但我可以告訴你,pom.xml具有特定包的import-package,但清單並不是因爲該包未明確用於代碼中。 –

+0

如果清單沒有導入包,那麼包不會被導入。期。清單如何以這種方式結束?誰知道。這是一個構建問題,所以你必須提供構建系統的細節。 –

回答

0

尼爾是正確的,如果它沒有在代碼中使用它不能被導入。隨着卡拉夫你有可能幫助。使用命令bundle:dynamic-import您可以在運行時將動態導入添加到捆綁包。有了這個,你可以通過bundle:headers找到實際需要的導入,你會發現這個包的導入包。拿這些,並將那些缺少的進口添加到您的清單生成和您的設置。

0

如果你不具有包:選項,使用此開發:命令:

dev:dynamic-import <BundleID> 

這樣就可以在運行時Karaf進口的依賴。