Java 如何筛选OSGi服务可见性?

Java 如何筛选OSGi服务可见性?,java,configuration,osgi,whiteboard,Java,Configuration,Osgi,Whiteboard,OSGi采用面向服务的体系结构:捆绑包注册其他捆绑包使用的服务对象。服务发布和绑定由框架管理。这将使服务提供者与服务用户完全分离(除了需要就服务接口达成一致) 有没有办法限制(通过配置)哪些捆绑包可以看到哪些服务 例如,如果我有一个HttpService,所有想要这样做的bundle都可以在其中安装servlet。我想使HttpService对选择性捆绑包不可见 额外积分:除了过滤服务注册外,还可以修改注册属性。因此,即使捆绑包使用alias=/admin注册Servlet,我也可以将其更改为a

OSGi采用面向服务的体系结构:捆绑包注册其他捆绑包使用的服务对象。服务发布和绑定由框架管理。这将使服务提供者与服务用户完全分离(除了需要就服务接口达成一致)

有没有办法限制(通过配置)哪些捆绑包可以看到哪些服务

例如,如果我有一个HttpService,所有想要这样做的bundle都可以在其中安装servlet。我想使HttpService对选择性捆绑包不可见

额外积分:除了过滤服务注册外,还可以修改注册属性。因此,即使捆绑包使用
alias=/admin
注册Servlet,我也可以将其更改为
alias=/somethingelse
,供Pax Web Extender白板使用

有没有办法限制(通过配置)哪些捆绑包可以看到哪些服务

使用服务属性无法做到这一点。您可以定义自己的服务属性,指定哪些bundle应该使用您正在导出的服务,但无法阻止其他bundle也使用它

额外积分:除了过滤服务注册外,还可以>修改注册属性。因此,即使捆绑包使用>alias=/admin注册Servlet,我也可以将其更改为alias=/somethingelse,以供Pax Web>Extender白板使用

嗯。。。这很难。您可以定义自己的Servlet接口“MyServlet”,并使用该接口导出Servlet。然后,另一个bundle可以使用这些myServlet,并将它们重新导出为具有修改的服务属性的Servlet


除此之外。。。不知道。

我还没有试过这个,但似乎它可以帮你

在OSGiR4组件规范中,描述了“配置管理服务”,通过5分钟的检查,它似乎能够动态更改服务

最终,我认为将由您根据一些商定的配置值来控制对服务的访问

有没有办法限制(通过配置)哪些捆绑包可以看到哪些服务

正如您所知,可以根据服务属性进行过滤,尽管这可能不会提供您所要求的控制类型:服务对于部署在框架中的其他bundle仍然可见

在SpringSource的dm服务器(一种开源、模块化、基于OSGi的Java应用服务器)中,应用程序可以在部署时确定其作用域。这允许您部署多个可能包含不一致版本的依赖捆绑包的应用程序(在单独的作用域中),同时仍然允许共享公共捆绑包(通过在所谓的全局作用域中的作用域之外部署它们)

如果一个作用域应用程序/捆绑包注册了一个OSGi服务,那么它只对同一作用域中的捆绑包可用。(服务也有“范围”。)

这并不是魔术:服务器包装OSGi服务接口,并使用“隐藏”的服务属性来动态执行所需的过滤

我想这会给你带来你想要的那种分离

有关dm服务器(不要与Spring dm混淆)的信息,请转到

史蒂夫·鲍威尔
SpringSource;dm服务器开发

额外积分:除了过滤服务注册外,还可以修改注册属性。因此,即使捆绑包使用alias=/admin注册Servlet,我也可以将其更改为alias=/somethingelse,以供PaxWebExtender白板使用


使用户可以非常简单地更改公开服务的属性。它还有一系列其他的特性,这可能会让经常使用OSGi的人感兴趣。

即将发布的OSGi规范R4.2定义了一个名为Find Hook的组件,它允许:
“检查返回的服务引用集,并选择性地收缩返回的服务集”


第12.5节


请注意,R4.2还不是最终版本,但我相信主要的OSGi实现(Felix和Equinox)在其主干中已经有了此附加功能的代码

如果您想限制服务的可见性,最好的选择是启用OSGi安全性。它旨在限制哪些捆绑包可以看到哪些服务、包和其他东西。例如,您只能使某个服务对您签署的捆绑包可用(或使用各种其他条件)

已经提到的另一个选项是使用4.2服务挂钩,它允许一种“自己动手”的安全机制


第二个问题是,更改属性,例如注册服务的端点,这是您可以通过注册服务时返回的ServiceRegistration来完成的。通过成为ManagedService并使用ConfigurationAdmin配置您自己,可以触发更改。

此应用程序范围功能(PAR文件?)看起来非常有用。PAR机制能在DM服务器之外使用吗?在标准OSGi中是否有类似的工作?在Java Posse播客上,有人谈论“嵌套框架”,这似乎是朝着这个方向发展的。是的,如果我能改变提供服务的捆绑包,或者改变使用服务的捆绑包,我就能控制事情的发展。但是我不想碰那些包裹。所有的服务绑定都已经由OSGi透明地(对消费者和生产者)管理,我想在流程中加入一些挂钩。。。据我所知,这是目前不可能与普通OSGi。正如Steve Powel指出的,使用Spring dm服务器还有其他可能性。是的,托管服务和服务组件运行时允许大量的运行时配置。然而,这项服务