【发布时间】:2016-11-27 09:27:49
【问题描述】:
我有一些不是 osgi 包的 jar 文件。我们称它为 starter.jar。我以这种方式运行这个启动器:java -jar starter.jar。这个 starter 启动了 felix 框架:
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 我会尝试的。似乎是个好主意。
标签: java osgi apache-felix