【发布时间】:2015-12-04 00:14:50
【问题描述】:
我有一个关于 OSGI 包部署的问题。
我有 7 个捆绑包,我需要按照严格的顺序部署,否则我会收到找不到类的错误。部分捆绑包用作静态库,部分用于导出 OSGI 服务。
在 OSGI 应用程序中,这个问题通常是如何解决的?
【问题讨论】:
标签: osgi apache-felix apache-karaf blueprint-osgi
我有一个关于 OSGI 包部署的问题。
我有 7 个捆绑包,我需要按照严格的顺序部署,否则我会收到找不到类的错误。部分捆绑包用作静态库,部分用于导出 OSGI 服务。
在 OSGI 应用程序中,这个问题通常是如何解决的?
【问题讨论】:
标签: osgi apache-felix apache-karaf blueprint-osgi
不解决这个问题解决了这个问题(至少,不是按照你要求的方式)。
也就是说:没有必须以严格的顺序安装/启动的包!这意味着您的捆绑包设计得很糟糕。相反,请更改您的捆绑包,以便它们可以按任何顺序开始。
如果您对此有疑问,请修改您的问题,以便我们了解您认为需要开始订购的原因。
【讨论】:
我同意,正如 Neil Bartlett 所说,最好的方法是避免它。然而,有时订购包的开头是必要的。即使使用 Equinox 或 Felix,您也可以使用 bundle start-level。它将确保您的捆绑包以特定顺序开始。
“启动级别与每个捆绑包相关联。启动级别是一个正整数值,用于控制捆绑包被激活/启动的顺序。具有低启动级别的捆绑包在具有高启动级别的捆绑包之前启动。因此, 启动级别为 1 的包首先启动,属于内核的包往往具有较低的启动级别,因为它们为运行大多数其他包提供了先决条件。” - Red Hat JBoss Fuse Documentation
希望对你有帮助。
【讨论】:
如果我正确理解您的问题,只需提供正确的依赖关系链以供 OSGi 解决。
您的库应导出您的服务将导入的包。
如果 BundleA 需要来自 BundleB 和 OtherBundle 的类,则在所有捆绑包的 MANIFEST.MF 中添加 Import-Package 和 Export-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 也可能有用。
【讨论】: