【问题标题】:OSGI: use service outside osgi container via systemBundleOSGI:通过 systemBundle 在 osgi 容器外使用服务
【发布时间】: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


【解决方案1】:

有两个适用的重要规则:

  1. 服务的提供者和消费者都必须相同导出中导入 API 包(即定义服务接口的包)。这可以以多种方式安排。提供者和消费者都从第三个 API 包中导入......或者提供者可以导出包,消费者从中导入......或者(很少)消费者可以导出包,提供者导入它。

  2. 系统包无法从普通包中导入包。只能导出。

第二条规则意味着当你想在系统包和普通包之间进行服务通信时,API包必须放在系统包的类路径中,并使用org.osgi.framework.system.packages.extra导出。然后普通的bundle以正常的方式导入包。无论系统捆绑包是服务的提供者还是消费者,您都必须这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 2012-09-16
    • 1970-01-01
    • 2015-07-20
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多