2016-07-23 71 views
-1

我有一些不是osgi包的jar文件。我們稱之爲starter.jar。我以這種方式運行這個啓動器:java -jar starter.jar。此啓動程序啓動felix框架:OSGI:通過系統捆綁使用osgi容器外的服務

Felix felix = new Felix(configMap); 
systemBundle=felix.getBundle(); 

然後安裝並啓動導出某些服務的osgi軟件包。

所以starter在osgi容器之外,但它有systemBundle的引用。在starter.jar中使用一些osgi服務可能並且正常(安全)嗎?

編輯 現在我知道這是可能的,因爲我有工作的解決方案(從starter.jar代碼):

BundleContext bundleContext=systemBundle.getBundleContext(); 
ServiceReference reference = bundleContext.getServiceReference(Temp.class.getName()); 
Object server = (Object) bundleContext.getService(reference); 
Method method = server.getClass().getMethod("getString"); 
Object result=method.invoke(server); 

我不得不使用反射,我得到了,因爲不同類加載器的ClassCastExceptions 。最終的解決方案相當難看。也許有人會提供更好的方法。或者除了通過網絡套接字以外沒有辦法?

+0

您可以將包含服務接口的包添加到嵌入式OSGi容器的系統包中。在這種情況下,您可以不使用反射來使用該服務。 –

+0

@Balazs Zsoldos我會嘗試。似乎是非常好的主意。 –

回答

1

有適用的兩個重要原則:

  1. 服務都必須導入API包(即定義服務接口的封裝)從相同出口的提供者和消費者。這可以通過幾種方式來安排。無論是提供者還是消費者從第三個API包導入...或者提供者可以導出包和消費者導入...或者(很少)消費者可以導出包並且提供者導入它。

  2. 系統軟件包無法從普通軟件包導入軟件包。它只能導出。

第二條規則意味着,當你想與系統捆綁和普通束之間的服務進行通信時,API包必須放在系統bundle的類路徑和使用org.osgi.framework.system.packages.extra出口。然後普通的包以正常的方式導入包。您必須這樣做,無論系統包是提供者還是服務的使用者。