2012-03-28 61 views
0

我已經編寫了一個API Bundle和一些實現服務。獲取api的所有實現

現在我想用它們作爲插件,所以首先我需要一個我擁有的所有服務的列表。

我開始API這樣的:

Framework m_fwk = new org.apache.felix.framework.FrameworkFactory().newFramework(null); 
    m_fwk.init(); 
    AutoProcessor.process(null, m_fwk.getBundleContext()); 
    m_fwk.start(); 

    Bundle api = m_fwk.getBundleContext().installBundle(
    "file:/foo/bar/api/target/api-1.0.jar"); 

    api.start(); 

所以,現在的API被加載。現在我需要知道哪些bundle實現了這個API,我如何從框架中獲取這些信息?

回答

1

你似乎只是加載一個API包,我想你想安裝其他包的實現?大多數人然後加載導演左右:

for (File b : bundles.listFiles()) {
ctx.installBundle(b.toURI().toURL());
} 每個包的應該像(使用DS):

@Component
public class Impl implements API {
public whatever() { ... }
}

埠ndle收集服務可能看起來像:

@Component
public class Collector {
@Reference(type='*') void addAPI(API api) { ... }
void removeAPI(API api) { ... }
}

這與BND註釋做了DS(見bndtools的例子)。但是,您也可以在Blueprint,iPojo和其他許多幫助程序中實現/收集服務。

+0

mh是的,我想要一個API,我需要安裝顯式。然後,我想從一個目錄中抓取所有包並查找實現該API的這些包。例如:我有一個插件API和大量的插件。現在我想加載與之前安裝的API版本相匹配的所有插件。我認爲你的例子會這樣做嗎? – reox 2012-04-09 07:26:51

2

這聽起來像你試圖重新實現OSGi服務註冊表。改爲查看藍圖或聲明式服務。至少我會建議使用OSGi服務API來註冊和使用服務。

1

鑑於Framework也是Bundle,你可以得到BundleContext,它允許你找到你需要的所有服務。你可以做類似

m_fwk.getBundleContext().getServiceReferences("com.example.MyInterface", null) 

以獲得給定服務的所有實現者。

但是,您應該意識到您生活在與您的框架中的居民不同的類加載器中。

+1

但這隻會在服務安裝正確時才起作用? – reox 2012-03-28 22:02:53

+0

那麼,您需要意識到框架的居民對界面的看法與您的界面不同。如果你只是想要所有的實現者,而不用擔心可分配性,可以使用'getAllServiceReferences'。 (如果這種可分配性讓你眼花繚亂,你可以閱讀OSGi類的處理。) – 2012-03-29 06:17:58