我对OSGI捆绑部署有疑问。
我有7个捆绑包,我需要以严格的顺序部署,否则我没有找到类错误。部分捆绑包用作静态库,其中一部分导出OSGI服务。
在OSGI应用程序中,这个问题通常是如何解决的?
答案 0 :(得分:4)
这个问题是通过解决它来解决的(至少,不是你提出的方式)。
那就是:没有必须以严格的顺序安装/启动的捆绑包!这意味着您的捆绑设计非常糟糕。相反,请更改您的捆绑包,以便它们可以按任何顺序启动。
如果您遇到此问题,请修改您的问题,以便我们了解您认为需要开始订购的原因。
答案 1 :(得分:2)
如果我正确理解您的问题,那么只需提供正确的依赖关系链即可由OSGi解决。
您的库应该导出您的服务将导入的包。
如果 BundleA 需要来自 BundleB 和 OtherBundle 的类,请在MANIFEST中添加Import-Package和Export-Package元数据。所有捆绑的MF应该足够了。
BundleA MANIFEST.MF
Import-Package:my.required.package.from.b,other.package.in.b,other.package
BundleB MANIFEST.MF
Export-Package:my.required.package.from.b,other.package.in.b
OtherBundle MANIFEST.MF
Export-Package:other.package
然后安装所有捆绑包,它们将处于INSTALLED
状态。启动主要的(在此示例中为 BundleA )。
OSGi将解决所有依赖关系(只是注意不要有循环),捆绑包将进入RESOLVED
状态(可用依赖项),然后ACTIVE
。
您无需手动添加这些依赖项,可以轻松配置maven-bundle-plugin等工具。
此问题What is the natural start order for package-dependent OSGI bundles也许有用。
答案 2 :(得分:1)
我同意Neil Bartlett提到的最佳方法是避免它。但是,有时需要订购捆绑包的开头。即使使用Equinox或Felix,您也可以使用bundle start-level。它将确保您的捆绑包以特定顺序启动。
“起始级别与每个捆绑包相关联。起始级别是一个正整数值,用于控制捆绑包的激活/启动顺序。具有较低启动级别的捆绑包在具有较高启动级别的捆绑包之前启动。 ,启动级别为1的bundle首先启动,属于内核的bundle往往具有较低的启动级别,因为它们提供了运行大多数其他bundle的先决条件。“ - Red Hat JBoss Fuse Documentation
希望它有所帮助。