如何定义OSGi包的起始级别?

xco*_*ist 12 java osgi

如何定义OSGi包的起始级别?

我正在使用Apache felix,并希望在框架执行中保持启动级别.我预计不需要在Manifest.MF的所有条目中非常频繁地更改捆绑的起始级别.MF似乎是最明智的.我要去org.osgi.framework.startlevel,但还没有看到一个实际的例子.

我也在使用maven和maven-bundle-plugin,如果有一种优雅的方式将POM中的起始级别合并到一起就很棒.

seh*_*seh 11

Bundle在构建时没有定义自己的起始级别; bundle 安装到框架中的管理员或代理定义它.

核心框架在第8节中定义了一个Start Level接口.引用:

Start Level API提供以下功能:

  • 控制OSGi框架的起始启动级别.

  • 用于修改Framework的活动启动级别.

  • 可用于为捆绑包指定特定的起始级别.

  • 可以为新安装的软件包设置初始启动级别.

最后两个与您的询问相关.第8.3.4节 - 更改Bundle的Start Level - 表示框架将持久存储指定的启动级别.

如果您使用的是Apache Felix,有几种方法可以安装捆绑包并分配其启动级别,无论是显式还是允许它们继承已安装捆绑包的默认启动级别:

另外,请参阅felix.startlevel.bundle属性,该属性控制通过上述方式以外的方式安装的软件包.

至于设置清单属性(例如在构建时使用Maven),过去常常有一种在Equinox中执行此操作的方法 - 现在已弃用 - 但是没有标准方法可以让bundle向框架指示其正确的启动级别应该.

  • 在生产应用程序中使用FileInstall是不切实际的.我建议您使用更稳定且可重复的机制来安装软件包,例如,通过读取包含具有起始级别的软件包位置列表的配置文件.(当然更好:完全停止依赖起始级别 - 你必须使用它们的事实通常表明你做错了什么). (4认同)
  • @Neil:为什么你说使用File Install在生产应用程序中不实用? (2认同)

Mik*_*Van 7

X,

我认为有一种更简单的方法来做你正在谈论的事情.目前,您正在直接使用Felix OSGi实现,这非常强大.但是,如果您希望对bundle部署进行精细控制,那么它将内置于名为Karaf的OSGi容器中.将Karaf想象成一款可以是Felix或Equinox的发动机.它可以在OSGi框架实现之上运行,并提供其他功能.例如,Karaf提供了供应机制.部署多个捆绑包称为"配置".由于Provisioning不是OSGi规范的一部分,因此不同的OSGi容器以不同的方式实现配置.在Karaf中,我们通过名为features.xml的文件来完成此操作.

在features.xml文件中,您可以标识要一起部署的一组特定包.然后你命名该组.在此文件中,您还可以识别您希望Karaf部署Bundes的特定开始顺序.

关于OSGi启动订单的一个词.在发生所有强制接线之前,无法启动捆绑.这意味着您可以定义一个起始顺序,但OSGi将其视为指导,而非强制性.例如,如果您有一个捆绑A需要导入捆绑包b的"foo"包,您可以告诉容器在B之前启动A所需的全部内容.但是它不会尊重这个顺序,因为实际上B需要启动以便A开始.没问题,容器知道(通常)启动捆绑的顺序.

在捆绑中使用可选与强制导入之间存在争议.如果您的包导入b.foo,但该导入是可选的,则容器将遵循包启动顺序(A然后B).但请注意,如果A实际上需要导入b.foo,但你已将其标记为可选,A将在没有连接到b.foo的情况下启动,并且A将抛出ClassNotFoundException.在Spring中使用各种包时,可能会出现这个令人讨厌的小错误.

为了让您的生活更轻松,Spring将其大部分进口作为"可选".如果给定的spring bundle实际上需要在工作之前解析依赖性并且导入被标记为可选,那么您的bundle将以sparodically部署.当然,对此的修复是创建一个捆绑片段,将捆绑导入修改为"强制",但这实际上超出了您的问题的范围.

我希望这能为你澄清一些事情.