如何定义 OSGi 捆绑包起始级别?
如何定义 OSGi 捆绑包起始级别?
我正在使用Apache felix,并希望跨框架执行持久化起始级别。我预计不需要非常频繁地更改捆绑包的起始级别,Manifest.MF中的条目似乎是最明智的。我已经去过 org.osgi.framework.startlevel,但还没有看到一个实际的例子。
我也在maven-bundle-plugin中使用maven,如果有一种优雅的方式将起始关卡合并到POM中,那将是非常棒的。
如何定义 OSGi 捆绑包起始级别?
我正在使用Apache felix,并希望跨框架执行持久化起始级别。我预计不需要非常频繁地更改捆绑包的起始级别,Manifest.MF中的条目似乎是最明智的。我已经去过 org.osgi.framework.startlevel,但还没有看到一个实际的例子。
我也在maven-bundle-plugin中使用maven,如果有一种优雅的方式将起始关卡合并到POM中,那将是非常棒的。
捆绑包不会在构建时定义自己的起始级别;将捆绑软件安装到框架中的管理员或代理程序定义它。
核心框架在第 8 节中定义了一个起始级别接口。引用:
起始级别 API 提供以下功能:
控制 OSGi 框架的起始起始级别。
用于修改框架的活动起始级别。
可用于为分发包指定特定的起始级别。
可以为新安装的捆绑软件设置初始启动级别。
最后两个与您在此处的查询相关。第 8.3.4 节 — 更改捆绑包的起始级别 — 表示框架将持续存储分配的起始级别。
如果您使用的是 Apache Felix,则有几种方法可以安装捆绑软件并分配其起始级别,无论是显式还是允许它们继承已安装捆绑软件的默认起始级别:
felix.fileinstall.start.level
)felix.auto.install.<n>
属性)bundlelevel
命令)另请参阅 felix.startlevel.bundle
属性,该属性控制通过上述方式以外的方式安装的捆绑软件。
至于设置清单属性(例如在构建时使用Maven),曾经有一种方法可以在Equinox中执行此操作 - 现在已经弃用 - 但是没有标准的方法可以让捆绑包向框架指示其正确的起始级别应该是什么。
X,
我认为有一种更简单的方法可以做你所说的。目前,您正在直接使用Felix OSGi实现,这非常强大。但是,如果你想要对捆绑部署进行精细控制,那就内置在一个名为Karaf的OSGi容器中。把卡拉夫想象成一辆汽车,它的引擎可以是Felix或Equinox。它建立在OSGi框架实现之上,并提供了额外的功能。例如,Karaf 提供了一个预配机制。部署多个分发包称为置备。由于预配不是 OSGi 规范的一部分,因此不同的 OSGi 容器以不同的方式实现预配。在Karaf中,我们通过一种称为功能.xml文件的东西来做到这一点。
在功能.xml文件中,标识要一起部署的一组特定捆绑包。然后命名该组。在此文件中,您还可以确定您希望Karaf部署联邦的具体启动顺序。
关于OSGi启动订单的一句话。在发生所有强制布线之前,无法启动捆绑包。这意味着您可以定义启动顺序,但 OSGi 将其作为指导,而不是必需的。例如,如果您有一个需要导入捆绑包 B 的 “foo” 包的捆绑包 A,则可以告诉容器在 B 之前启动 A。但它不会尊重这个顺序,因为在现实中,B需要启动才能启动A。不过没关系,容器知道(通常)以什么顺序启动捆绑包。
摩擦来自捆绑使用可选与强制导入。如果您的捆绑包导入 b.foo,但该导入是可选的,则容器将遵循捆绑包启动顺序(A 然后 B)。但请注意,如果 A 确实需要导入 b.foo,但您已将其标记为可选,则 A 将开始不连接 b.foo,而 A 将抛出 ClassNotFoundException。在春季使用各种软件包时,可能会发生这个令人讨厌的小错误。
为了让您的生活变得轻松,Spring将大部分进口产品作为“可选”产品。如果给定的 spring 捆绑包在工作之前确实需要解析依赖关系,并且该导入被标记为可选,则您的捆绑包将以稀疏方式部署。当然,解决这个问题的方法是创建一个捆绑包片段,将捆绑包导入修改为“强制性”,但这确实超出了你的问题范围。
我希望这能为您澄清一些事情。