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

时间:2011-09-18 14:51:45

标签: java osgi

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

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

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

3 个答案:

答案 0 :(得分:11)

Bundle在构建时没有定义自己的启动级别;将安装捆绑包的管理员或代理定义到框架中。

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

  

Start Level API提供以下功能:

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

  •   
  • 用于修改框架的活动开始级别。

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

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

  •   

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

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

另请参阅felix.startlevel.bundle property,它通过上述方式之外的方式控制安装的软件包。

至于设置一个清单属性(例如在构建时使用Maven),过去常常有一种在Equinox中执行此操作的方法 - 现在已弃用 - 但是没有标准的方法可以让bundle向框架指示它是什么适当的起始水平应该是。

答案 1 :(得分: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部署。当然,对此的修复是创建一个捆绑片段,将捆绑导入修改为“强制”,但这实际上超出了您的问题的范围。

我希望这能为你澄清事情。

答案 2 :(得分:2)

bundle.adapt(BundleStartLevel.class).setStartLevel(startlevel);