如何定义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.fileinstall.start.level属性,但不是每个包)felix.auto.install.<n>酒店)bundlelevel命令)另外,请参阅felix.startlevel.bundle属性,该属性控制通过上述方式以外的方式安装的软件包.
至于设置清单属性(例如在构建时使用Maven),过去常常有一种在Equinox中执行此操作的方法 - 现在已弃用 - 但是没有标准方法可以让bundle向框架指示其正确的启动级别应该.
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部署.当然,对此的修复是创建一个捆绑片段,将捆绑导入修改为"强制",但这实际上超出了您的问题的范围.
我希望这能为你澄清一些事情.