Binding 使用版本解析osgi服务

Binding 使用版本解析osgi服务,binding,service,osgi,versioning,Binding,Service,Osgi,Versioning,我目前正在评估osgi使用felix 4.3实现来管理服务的版本 我一直在创建以下捆绑包: 定义接口x.y.z.SomeService的捆绑api版本1.0.0: 它在版本1.0.0中导出x.y.z bundle impl版本1.0.0,它实现了SomeService版本1.0.0,导入规范版本1.0.0中的包x.y.z并注册服务 定义接口x.y.z.SomeService的捆绑api版本2.0.0: 它在版本2.0.0中导出x.y.z bundle impl版本2.0.0,它实现了SomeSe

我目前正在评估osgi使用felix 4.3实现来管理服务的版本

我一直在创建以下捆绑包:

定义接口x.y.z.SomeService的捆绑api版本1.0.0: 它在版本1.0.0中导出x.y.z

bundle impl版本1.0.0,它实现了SomeService版本1.0.0,导入规范版本1.0.0中的包x.y.z并注册服务

定义接口x.y.z.SomeService的捆绑api版本2.0.0: 它在版本2.0.0中导出x.y.z

bundle impl版本2.0.0,它实现了SomeService版本2.0.0,导入规范版本2.0.0中的包x.y.z并注册服务

现在,我有一个客户端,bundle客户端版本1.0.0,它在版本规范-1.0.0中导入bundle api的x.y.z

如何在版本1.0.0中获得x.y.z.SomeService的服务

当前,在安装/激活时: 捆绑api 1.0.0 bundle impl 1.0.0 捆绑api 2.0.0 bundle impl 2.0.0 捆绑客户端1.0.0

启动bundle client时,它会查询可用的x.y.y.SomeService。 我得到可用服务的答案: bundle impl 1.0.0和bundle impl 2.0.0

我只希望得到与版本1.0.0匹配的服务实现

我应该如何进行


ps:目前,我将null设置为筛选值。

您使用什么代码或机制来查询服务?OSGi自动提供服务兼容性过滤,这意味着如果您的客户端导入API的1.0版,那么它将只看到实现1.0版的服务;如果您的客户端导入API的2.0版,那么它将只看到实现2.0版的服务。。。。等等

但是,有一个方法调用getAllServiceReferences,它显式关闭此兼容性检查,并可用于获取所有版本的所有服务。在99%的情况下,这不是你想要做的。如果使用了getAllServiceReferences,请尝试更改为getServiceReferences


如果您正在以其他方式查找服务,那么我需要更多详细信息来进一步帮助您。

您使用什么代码或机制来查询服务?OSGi自动提供服务兼容性过滤,这意味着如果您的客户端导入API的1.0版,那么它将只看到实现1.0版的服务;如果您的客户端导入API的2.0版,那么它将只看到实现2.0版的服务。。。。等等

但是,有一个方法调用getAllServiceReferences,它显式关闭此兼容性检查,并可用于获取所有版本的所有服务。在99%的情况下,这不是你想要做的。如果使用了getAllServiceReferences,请尝试更改为getServiceReferences


如果您正在以其他方式查找服务,那么我需要更多详细信息来进一步帮助您。

您可以使用version=1.0.0和version=2.0.0之类的属性发布服务。然后您可以过滤版本为1.0.0的服务


我不知道这些服务应该通过Neil提到的包版本进行过滤。由于尼尔确实是这一领域的专家,我相信他是对的。因此,felix实现中可能存在bug?

您可以使用version=1.0.0和version=2.0.0这样的属性发布服务。然后您可以过滤版本为1.0.0的服务


我不知道这些服务应该通过Neil提到的包版本进行过滤。由于尼尔确实是这一领域的专家,我相信他是对的。因此,felix实现中可能存在缺陷?

服务的版本由其接口的Java包控制。如果您根据OSGi语义版本模型正确地对该包进行了版本设置,并执行了相应的包导入,那么OSGi框架将自动为您进行选择。所有OSGi服务都以这种方式进行版本控制

手工维护这一点就像手工将java代码编译成字节码,有很多工具可以实现这一点。bndtools提供了广泛的支持,可以最大限度地减少对这些版本的处理和验证


OSGi的整体思想是,您只接触兼容的包。

服务的版本由其接口的Java包控制。如果您根据OSGi语义版本模型正确地对该包进行了版本设置,并执行了相应的包导入,那么OSGi框架将自动为您进行选择。所有OSGi服务都以这种方式进行版本控制

手工维护这一点就像手工将java代码编译成字节码,有很多工具可以实现这一点。bndtools提供了广泛的支持,可以最大限度地减少对这些版本的处理和验证


OSGi的整体理念是您只能接触兼容的软件包。

neil,谢谢您的回复。查询服务的代码如下所示:List实际上,当使用getServiceReferences类clazz、字符串过滤器进行查询时,
这将被转换为getServiceReferences clazz.getName,由felix实现过滤。事实上,我正在寻找的是一个接口的实际实现,但似乎我正在为一个与接口名称匹配的名称获取服务。。。或者我缺少什么?OSGi服务是一个接口实现,由接口名称映射。所以你得到了你想要的东西。问题是接口的版本是有限制的。ie:在版本1中,我们有:公共接口IMyItf{String getData;},在版本2中,相同的接口将被更改为公共接口IMyItf{String getData;int getCount;}版本1中的实现类MyItf实现版本1的IMyItf,位于导入版本1的IMyItf包的捆绑包中,并将其自身标记为版本1,而捆绑包的更新在v2中实现IMyItf v2,导入版本2neil的IMyItf包,感谢您的回复。查询服务的代码如下所示:List实际上,当使用getServiceReferences类clazz,String filter进行查询时,felix实现会将其转换为getServiceReferences clazz.getName,filter。事实上,我正在寻找的是一个接口的实际实现,但似乎我正在为一个与接口名称匹配的名称获取服务。。。或者我缺少什么?OSGi服务是一个接口实现,由接口名称映射。所以你得到了你想要的东西。问题是接口的版本是有限制的。ie:在版本1中,我们有:公共接口IMyItf{String getData;},在版本2中,相同的接口将被更改为公共接口IMyItf{String getData;int getCount;}版本1中的实现类MyItf实现版本1的IMyItf,位于导入版本1的IMyItf包的捆绑包中,并将其自身标记为版本1,而v2中的捆绑包更新实现IMyItf v2,导入版本2的IMyItf包