Apache Karaf 如何对要安装和启动的包进行排序?

Posted

技术标签:

【中文标题】Apache Karaf 如何对要安装和启动的包进行排序?【英文标题】:How Apache Karaf sorts bundles to install and start? 【发布时间】:2013-05-01 08:24:06 【问题描述】:

我已经定义了四个捆绑包:

bundle 1 : export package x version 1
bundle 2 : import package x ver [1,2] and export package y;y uses x    
bundle 3 : export package x version 2
bundle 4 : import package y and also import package x version 2

使用 apache felix(可分发二进制文件),我发现我应该手动强制不解析(或启动)捆绑包 1,然后在启动捆绑包 3 之前捆绑包 2(否则会出现使用约束问题,因为捆绑包 2 将使用包x 版本 1 和捆绑包 4 中将出现包 x 版本 1 和版本 2 --> 使用约束违规)。 感谢这些帖子的作者:http://njbartlett.name/2011/02/09/uses-constraints.htmlhttp://blog.springsource.com/2008/10/20/understanding-the-osgi-uses-directive/ 我不喜欢对我的包强加命令,我需要复制 /bundle 目录中的所有包,然后安装框架实例并启动它们。 我注意到 Apache felix 按字母顺序对要安装的包进行排序(因此将安装包 1,然后首先启动)。 我尝试使用 Apache karaf,将我的包复制到 /deploy 中,发现问题消失了,所以我的问题是:

Apache Karaf(或 felix 文件安装)是否应用策略来强制启动捆绑包的任何顺序以避免此类问题?

【问题讨论】:

【参考方案1】:

您应该尝试使用 Karaf 功能进行此类部署。您创建一个包含一个功能的功能文件,并将所有捆绑包添加到此功能。然后,Karaf 将加载所有包并解析并一次性启动它们。所以解析器应该能够正确解析你所有的包。

【讨论】:

感谢 Christian Schneider 的澄清,所以,如果我理解的话,我可以将 Karaf 功能定义为一组捆绑包,这些捆绑包将在我安装和启动功能,并且 Karaf 容器将应用一种策略来正确解析这些捆绑包,避免“使用约束违规”?如果属实,您能否解释一下 Karaf 是什么来确定解决捆绑包的最佳顺序,这不是由 felix 完成的?谢谢 Karaf 只是使用 felix 功能来解析包。与 fileinstall 的主要区别在于它可以将捆绑包解析为一个完整的集合,而不是单独安装捆绑包。有关功能的示例,请参阅:github.com/cschneider/Karaf-Tutorial/tree/master/tasklist 谢谢你的例子,我已经看到了,它真的很有帮助:) 请提出其他问题,所以,定义一个 Karaf 功能 允许将所有功能的捆绑包一起启动通过,但没有计算顺序,例如,回到我放的示例,Karaf 可能会安装四个捆绑包,并按照顺序(b1 然后 b2 然后 b3 然后 b4)解决它们,这会抛出有问题的异常?是这样吗?是否类似于在启动容器之前复制 /deploy 目录中的所有这些包(因此 felix 文件安装将在同一个轮询中检索它们)? 因为即使使用 Apache Felix 的可分发二进制文件,并且通过复制 /deploy 目录中的包,felix 将在一个段落中解决它们(安装所有包,然后返回一个一个开始),我们总是会发现这个错误?使用 felix file-install 并同时将所有这些包放在监视目录中时也是如此(因此是相同的轮询) Apache Karaf 没有创建特殊命令来避免包使用冲突,这是 felix 解析器的职责。听起来您的案例似乎没有包含在解析器中,但我不确定它的内部工作原理。无论如何,对您来说安全的解决方案是避免使用包装。如果捆绑包是由您开发的,那么也许您可以使用更好的封装来解决这个问题。【参考方案2】:

Apache Karaf 会自动将启动级别添加到部署文件夹中的捆绑包,这是可配置的。它的默认值为 50。因此,您所有的自定义包都安装为 StartLevel 50。这也确保了 karaf 本身的基本包已经启动并运行,尤其是文件安装包。

【讨论】:

感谢您的回复 :) 我的问题是部署文件夹中这些捆绑包的顺序,您有解释吗? 我不认为开始级别是相关的......在这种情况下,这是安装/解决顺序的问题。 正如 Neil 指出的一个问题是 fileinstall 会以一定的间隔轮询目录。如果您将一半的捆绑包复制到部署文件夹并且 fileinstall poll 启动,那么它只会部署一半的捆绑包。【参考方案3】:

Felix FileInstall 没有任何排序功能。

启动顺序并不重要(包应该能够以任何顺序启动),但是一个好的管理代理应该能够将一批包作为单个操作安装和解析.但是 FileInstall 会在碰巧轮询文件系统目录时安装/解析/启动捆绑包。因此 FileInstall 并不能真正用于生产部署。

我对Karaf一无所知,但是任何简单地轮询目录的管理代理都可能有同样的问题。

【讨论】:

以上是关于Apache Karaf 如何对要安装和启动的包进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Karaf配置远程调试

在 karaf 中启动包时出错:“通过两个依赖链”

OSGi:无法在 Apache Karaf 中找到 UserAdmin

Apache Karaf 和 OSGI 捆绑包

Apache Karaf 与 Servicemix

无法捕获 Apache Karaf 客户端输出