我们有两个包,都嵌入了同一个 3rd 方库的不同版本,我们必须以不同的配置使用它们。不幸的是,该库只能通过系统属性进行配置。
因此,我们尝试执行以下Activator
课程:
- 设置所需的系统属性,
- 初始化库,
- 取消设置以前的系统属性。
如果 OSGi 框架同时启动这两个包,它将无法工作。是否允许 OSGi 框架实现?这个解决方案安全吗?有没有其他方法可以为不同的捆绑包将相同的系统属性设置为不同的值?
(如果可能的话,我们希望避免为这些捆绑包设置不同的启动级别。)
我们有两个包,都嵌入了同一个 3rd 方库的不同版本,我们必须以不同的配置使用它们。不幸的是,该库只能通过系统属性进行配置。
因此,我们尝试执行以下Activator
课程:
如果 OSGi 框架同时启动这两个包,它将无法工作。是否允许 OSGi 框架实现?这个解决方案安全吗?有没有其他方法可以为不同的捆绑包将相同的系统属性设置为不同的值?
(如果可能的话,我们希望避免为这些捆绑包设置不同的启动级别。)
允许 OSGi 框架实现在给定的启动级别内同时启动捆绑包。因此,您可以将捆绑包置于不同的启动级别,以确保一个在另一个之前启动。
在 Felix 和 Equinox 中,bundle install/resolve/start/stop/uninstall 操作都发生在单个线程上。我无法确定激活器是否在同一线程上运行,但我认为它们确实如此。
如何创建一个包装库初始化的 OSGi 服务。所以你只需要做一次。或者,服务可以同步初始化,因此确保它不会同时发生。
将它们放在单独的捆绑包中是否有很强的要求?您如何处理这些库,是将它们导出为 java 包还是使用它们创建服务?如果您可以将两个库放在同一个包中,则您可以完全控制哪个首先初始化,哪个是第二个。
顺便说一句,如果您使用 Export-Package 在捆绑清单中导出它们,请记住,即使捆绑处于 RESOLVED 状态(即已安装但尚未启动),其他捆绑也可以使用导出的包。因此,即使在您的 Bundle Activator 已创建并已处理初始化之前,也可能有人调用 lib 的方法......