我目前正在评估osgi(使用felix 4.3实现)来管理服务版本。
我一直在创建以下捆绑包:
bundle-api(版本1.0.0),定义接口x.y.z.SomeService: 它在版本1.0.0中导出x.y.z
实现SomeService(v 1.0.0)的bundle-impl(版本1.0.0),在规范版本1.0.0中导入包x.y.z并注册服务
bundle-api(版本2.0.0),定义接口x.y.z.SomeService: 它在2.0.0版本中导出x.y.z
实现SomeService(v 2.0.0)的bundle-impl(版本2.0.0),在规范版本2.0.0中导入包x.y.z并注册服务
现在,我有一个客户端,bundle-client(版本1.0.0),它在版本规范-1.0.0中导入bundle-api的x.y.z。
如何在版本1.0.0中获取x.y.z.SomeService的服务?
目前,在安装/激活时: bundle-api 1.0.0 bundle-impl 1.0.0 bundle-api 2.0.0 bundle-impl 2.0.0 bundle-client 1.0.0
当启动bundle-client时,它会查询可用的x.y.y.SomeService。 我得到了可用服务的答案: bundle-impl 1.0.0和bundle-impl 2.0.0
我想只获得与版本1.0.0匹配的服务实现。
我该怎么办?
ps:目前,我将null设置为过滤值。
答案 0 :(得分:5)
您使用什么代码或机制来查询服务? OSGi自动提供服务兼容性过滤,这意味着如果您的客户端导入API的1.0版本,那么它只会看到实现1.0版本的服务,如果您的客户端导入API的2.0版本,那么它只会看到实现2.0版本的服务......等等。
但是有一个方法调用getAllServiceReferences()
明确禁用此兼容性检查,并可用于获取所有版本的所有服务。在99%的情况下,这不是你想要做的。如果您已使用getAllServiceReferences()
,请尝试更改为getServiceReferences()
。
如果您正在以其他方式查找服务,那么我需要更多详细信息来帮助您。
答案 1 :(得分:0)
您可以做的是使用版本= 1.0.0和版本= 2.0.0的属性发布服务。然后,您可以使用(version = 1.0.0)过滤服务。
我不知道应该通过Neil提到的软件包版本来过滤服务。由于尼尔真的是这个领域的专家,我相信他是对的。那么felix实现可能有一个错误吗?
答案 2 :(得分:0)
服务由其接口的Java包进行版本控制。如果您根据OSGi语义版本控制模型正确地对该软件包进行版本化并执行相应的软件包导入,那么OSGi框架将自动为您进行选择。所有OSGi服务都以这种方式进行版本化。
手工维护这就像手工编写java代码到字节代码一样,有工具可供使用。 bnd(tools)提供广泛的支持,以最大限度地减少处理和验证这些版本。
OSGi的整个想法是,您只接触兼容的软件包。