我有一些不是osgi包的jar文件。我们称之为starter.jar。我用这种方式运行这个启动器:java -jar starter.jar。这个启动器启动了felix框架:
Felix felix = new Felix(configMap);
systemBundle=felix.getBundle();
然后安装并启动osgi bundle,导出一些服务。
所以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 :(得分:1)
有两个重要的规则适用:
服务的提供者和使用者必须从相同导出中导入API包(即定义服务接口的包)。这可以以多种方式安排。提供者和消费者都可以从第三个API包导入...或者提供者可以导出包和消费者从中导入...或者(很少)消费者可以导出包,提供者可以导入包。
系统捆绑包无法从普通捆绑包导入包。它只能导出。
第二个规则意味着当您想要与系统包和普通包之间的服务进行通信时,必须将API包放在系统包的类路径中并使用org.osgi.framework.system.packages.extra
导出。然后普通的bundle以正常的方式导入包。无论系统包是提供者还是服务的使用者,您都必须这样做。