OSGi:通过编程决定是否可以启动捆绑包
上下文 我有一个基于OSGi的大型(Equinox3.9/EclipseRCP4.4)应用程序,还有几个“可选”包。这些可选捆绑包中的每一个都提供了可选的用户界面和一些额外的服务(通过SCR组件),这些服务只适用于我们的一部分客户 应用程序始终作为预打包安装分发(也就是说,我们不使用P2或任何其他自动配置机制)。直到最近,我们为每个需要一些可选捆绑包的客户构建了不同的预打包安装。可选捆绑包的数量正在增长,要构建的定制预打包安装的数量也在增长 因此,我们希望只构建一个安装包交付给所有客户,其中包含所有可选捆绑包,然后在运行时决定应启动哪些可选捆绑包。但这里有一个转折点:要启用的可选功能集只有在用户通过服务器身份验证后才知道。也就是说,一些最终用户可以访问多个帐户,每个帐户都可以访问一组不同的可选功能。因此,在用户登录之前,可选捆绑包必须保持不可用,然后只加载允许的可选捆绑包。由于这些可选捆绑包通过各种扩展器(Eclipse的插件注册表、SCR和蓝图)做出贡献,这意味着在确定它们确实有权启动之前,不允许可选捆绑包达到已解决状态。在用户登录和注销特定服务器帐户时,还必须能够加载和卸载这些可选捆绑包 潜在的解决方案和问题 我已经确定了一些潜在的解决方案,但每个方案都有未解决的问题。所以我只需要对以下任何一种情况的所有问题给出正确的肯定答案OSGi:通过编程决定是否可以启动捆绑包,osgi,equinox,osgi-bundle,Osgi,Equinox,Osgi Bundle,上下文 我有一个基于OSGi的大型(Equinox3.9/EclipseRCP4.4)应用程序,还有几个“可选”包。这些可选捆绑包中的每一个都提供了可选的用户界面和一些额外的服务(通过SCR组件),这些服务只适用于我们的一部分客户 应用程序始终作为预打包安装分发(也就是说,我们不使用P2或任何其他自动配置机制)。直到最近,我们为每个需要一些可选捆绑包的客户构建了不同的预打包安装。可选捆绑包的数量正在增长,要构建的定制预打包安装的数量也在增长 因此,我们希望只构建一个安装包交付给所有客户,其中包含
- 将可选捆绑包放在不同的目录中,然后使用BundleContext#installBundle(…)启用这些捆绑包。尽管此解决方案在部署时确实可以工作,但它给开发带来了巨大的负担(因为捆绑包位于某个难以预测的文件夹中,相对于工作区、本地git配置、测试环境等等,因此无法正确构建要提供给#installBundle的位置)。打包过程也变得更加复杂,因为我们首先需要将这些可选包分开,然后更新几个Equinox/P2配置文件,以防止它们找到这些现在丢失的包
- 通过有条件地从其激活器中抛出异常,防止激活可选捆绑包。这根本不能解决我们的问题,因为仍然允许选项束达到已解决状态,因此能够通过中间扩展器做出贡献
- 使用P2在运行时安装新功能。这里的问题是,通过P2对bundle列表所做的更改1)本质上是持久的(这意味着可选功能将在下一次启动时自动重新启用),2)需要重新启动framwork才能正确完成