gpt4 book ai didi

java - OSGI:通过systemBundle使用osgi容器外部的服务

转载 作者:行者123 更新时间:2023-12-02 03:27:54 25 4
gpt4 key购买 nike

我有一些不是 osgi bundle 的 jar 文件。我们将其命名为starter.jar。我这样运行这个启动器:java -jar starter.jar。这个启动器启动 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。最终的解决方案相当丑陋。也许有人会提供更好的方法。或者除了通过网络套接字之外没有其他办法?

最佳答案

有两条重要的规则适用:

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

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

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

关于java - OSGI:通过systemBundle使用osgi容器外部的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38544012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com