OSGi:以编程方式决定是否可以启动捆绑包

时间:2014-12-08 20:03:53

标签: osgi equinox osgi-bundle

上下文

我有一个基于OSGi的大型(Equinox 3.9 / Eclipse RCP 4.4)应用程序,有一些"可选"捆绑。这些可选包中的每一个都提供备用用户界面和一些额外服务(通过SCR组件),这些服务仅适用于我们客户的一部分。

应用程序始终作为预打包安装进行分发(即,我们不使用P2或任何其他自动配置机制)。直到最近,我们为每个需要一些可选捆绑包的客户构建了不同的预打包安装。可选捆绑包的数量正在增长,要构建的自定义预打包安装的数量也在增长。

因此,我们只想构建一个安装包,交付给所有客户,包含所有可选包,然后在运行时决定启动哪些可选包。但这就是扭曲:只有在用户通过服务器验证自己之后才能知道要启用的可选功能集。也就是说,一些最终用户可以访问多个帐户,每个帐户都可以访问要启用的一组不同的可选功能。因此,在用户登录之前,可选捆绑包必须保持不可用,然后,只允许加载可选捆绑包。由于这些可选包通过各种扩展程序(Eclipse'插件注册表,SCR和蓝图)做出贡献,这意味着在确定它们确实被授权启动之前,不得允许可选包到达RESOLVED状态。当用户登录和注销特定服务器帐户时,还必须能够加载和卸载这些可选包。

潜在的解决方案和问题

我已经确定了一些可能的解决方案,但每个解决方案都有未解决的问题。因此,对于以下任何一种情况的所有问题,我只需要正确的答案。

  1. 让可选捆绑包需要一些"启用"能力。我认为这是最干净的方法。可选的bundle会添加类似" Require-capability:com.acme.optionalfeatures;标识符=我的定制特征标识符&#34 ;.在运行时,在用户进行身份验证之前,该功能将保持未解析状态,因此扩展程序会自动忽略该捆绑包。一旦注册启用功能,捆绑包将自动更改状态。太棒了。但这里缺少部分:a)如何注册新功能命名空间? b)我可以动态更改捆绑包提供的功能,如果是,我怎么能这样做? c)(如果(b)不可能)我可以动态注册一个新的"资源"新功能,如果是,我该怎么办?

  2. 让可选包导入一些"启用"这是上一个场景的变体,它可能比自定义功能命名空间更容易管理......那些"启用包"然后可以通过"动态创建"来存在。包。也就是说,一些管理器bundle会使用ByteArrayInputStream调用BundleContext#installBundle(String,InputStream),返回一个包含Manifest.MF的动态生成的bundle归档文件,该文件导出适当的"启用包"。听起来很简单,但工具链中的几个组件(IDE,PDE,P2,产品导出......)会抱怨这些必需的软件包不存在这一事实。为了避免这些问题,需要在安装到框架中时动态添加require-package头。但是是否有任何机制允许早期更改捆绑包的标头(即捆绑包安装到框架中)?类编织在这里不适用。

  3. 让可选捆绑包都需要一个启用包(完全相同),确实存在。然后,Resolve Hook会过滤掉从潜在接线候选者中导出该包的捆绑包可选包尚未获得授权。但是我怎么能在以后要求重新考虑所有捆绑包以便在用户登录或注销时进行解析?

  4. 排除的解决方案

    以下解决方案已被排除在外:

    • 将可选包放在不同的目录中,然后使用BundleContext#installBundle(...)来启用这些包。虽然这个解决方案确实在部署时工作,但它给开发带来了很大的负担(因为捆绑包在一些难以预测的文件夹中,相对于工作空间,本地git配置,测试环境等等,因此无法正确构建要提供给#installBundle的位置。打包过程也变得复杂得多,因为我们首先需要拆开这些可选包,然后更新几个Equinox / P2配置文件,以防止它们找到这些现在丢失的包。

    • 通过条件性地从激活器中抛出异常来阻止可选捆绑包被激活。这根本不能解决我们的问题,因为选项包仍然可以达到RESOLVED状态,因此能够通过扩展器的中间件做出贡献。

    • 使用P2在运行时安装新功能。这里的问题是通过P2 1)对包列表的更改本质上是持久的(这意味着可选功能将在下次启动时自动重新安装)和2)需要重新启动框架才能正确完成。

    注意:我们没有"安全" - 关于这些额外捆绑包实际分发给不需要它们的用户的事实。我知道用户可能很容易破解安装,以强制启动一些可选的捆绑包。这不会造成重大问题。

1 个答案:

答案 0 :(得分:0)

您可以创建和安装捆绑包,该捆绑包提供可选捆绑包所需的功能或包。这将使他们得以解决。

但是,当多个用户访问具有不同权限的服务器时,我不明白您的模型将如何工作。更具特权的用户会导致可选捆绑包激活"因此,这些功能可供同时访问服务器的较少特权用户使用。