【问题标题】:Order of deployment of bundles捆绑包的部署顺序
【发布时间】:2015-12-04 00:14:50
【问题描述】:

我有一个关于 OSGI 包部署的问题。

我有 7 个捆绑包,我需要按照严格的顺序部署,否则我会收到找不到类的错误。部分捆绑包用作静态库,部分用于导出 OSGI 服务。

在 OSGI 应用程序中,这个问题通常是如何解决的?

【问题讨论】:

    标签: osgi apache-felix apache-karaf blueprint-osgi


    【解决方案1】:

    不解决这个问题解决了这个问题(至少,不是按照你要求的方式)。

    也就是说:没有必须以严格的顺序安装/启动的包!这意味着您的捆绑包设计得很糟糕。相反,请更改您的捆绑包,以便它们可以按任何顺序开始。

    如果您对此有疑问,请修改您的问题,以便我们了解您认为需要开始订购的原因。

    【讨论】:

      【解决方案2】:

      我同意,正如 Neil Bartlett 所说,最好的方法是避免它。然而,有时订购包的开头是必要的。即使使用 Equinox 或 Felix,您也可以使用 bundle start-level。它将确保您的捆绑包以特定顺序开始。

      “启动级别与每个捆绑包相关联。启动级别是一个正整数值,用于控制捆绑包被激活/启动的顺序。具有低启动级别的捆绑包在具有高启动级别的捆绑包之前启动。因此, 启动级别为 1 的包首先启动,属于内核的包往往具有较低的启动级别,因为它们为运行大多数其他包提供了先决条件。” - Red Hat JBoss Fuse Documentation

      希望对你有帮助。

      【讨论】:

      • 使用起始级别并不能阻止您遇到问题。启动级别内的启动顺序是未定义的,您不能打破循环。
      【解决方案3】:

      如果我正确理解您的问题,只需提供正确的依赖关系链以供 OSGi 解决。
      您的库应导出您的服务将导入的包。

      如果 BundleA 需要来自 BundleBOtherBundle 的类,则在所有捆绑包的 MANIFEST.MF 中添加 Import-PackageExport-Package 元数据应该足够了。

      BundleA MANIFEST.MF

      导入包:my.required.package.from.b, other.package.in.b, other.package

      BundleB MANIFEST.MF

      导出包:my.required.package.from.b, other.package.in.b

      OtherBundle MANIFEST.MF

      导出包:other.package

      然后安装所有包,它们将处于INSTALLED 状态。启动主要的(在本例中为 BundleA)。 OSGi 将解决所有依赖项(请注意不要有循环),捆绑包将进入RESOLVED 状态(依赖项可用),然后进入ACTIVE

      您不需要手动添加这些依赖项,maven-bundle-plugin 等工具可以轻松配置。

      这个问题What is the natural start order for package-dependent OSGI bundles 也可能有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        相关资源
        最近更新 更多