我有一些不是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 。最終的解決方案相當難看。也許有人會提供更好的方法。或者除了通過網絡套接字以外沒有辦法?
您可以將包含服務接口的包添加到嵌入式OSGi容器的系統包中。在這種情況下,您可以不使用反射來使用該服務。 –
@Balazs Zsoldos我會嘗試。似乎是非常好的主意。 –