【问题标题】:What is the standard behaviour in OSGI for the container to pick a package that is exported by multiple bundles?OSGI 中容器选择由多个包导出的包的标准行为是什么?
【发布时间】:2011-08-31 02:34:50
【问题描述】:

我只是想知道如果同一个包被不同的包多次导出,容器如何选择哪个包来加载一个类。

鉴于以下事实。请注意,该列表还包含捆绑包的实际部署顺序。

  • package.x 版本 1 (A)
  • package.x 版本 2 (B)
  • package.x 版本 3 (C)

如果添加了第 4 个捆绑包并且它需要 'package.x.SomeClass' 1-2 从哪里选择?

  • 它是从 A 还是 B 中随机选择的?
  • 是否因为冲突而无法部署B?
  • 它选择 A 是因为它是第一个吗?

所有容器都做同样的事情,还是可用的流行包之间的行为不同?

【问题讨论】:

  • 你能澄清一下这些版本吗?导出看起来像范围,但没有导出范围之类的东西。应该说 1.2、1.4 和 2.3 吗? 4th bundle 需要的导入范围是多少?像[1.0,2.0) 这样的东西?如果您澄清这些问题,我应该能够回答您的问题。
  • @NB 对不起,我得到了我请求的范围和导出版本错误的方式..将修复。

标签: osgi


【解决方案1】:

框架会选择 A 或 B。它不会“随机”这样做,但启发式方法很复杂,最好不要试图预测会发生什么。此外,这种情况下的行为未指定,并且受 OSGi 框架实现之间的差异的影响。

【讨论】:

  • 我猜容器将从它已经导入最多包(直接/间接)的包中挑选。这是一个公平的说法吗?
  • @mP,不,它是“未指定”。如果您需要这方面的知识,请查看您正在使用的 OSGi 实现;不过,我建议重新考虑为什么需要这种能力。
  • 我实际上不需要 q 突出显示的功能,我只是在现实中处理这种极端情况。
  • Niel,这是在 OSGi 规范中定义的。所有容器将从 0.0.0 开始,并递增到容器中可用库的最低版本。
  • Mike,你能参考一下你从中得到的 OSGi 规范的一部分吗?问候,尼尔。
【解决方案2】:

OSGi 是一个组件框架,整个想法是这类问题没有必要讨论,因为它们可能会因框架和已安装捆绑包的设置而异。您所做的任何未指定的假设都可能被违反并使您的代码崩溃。 OSGi 的美妙之处在于它允许您指定您的约束。 OSGi 框架永远不会违反您的约束,这是您的保证。它如何在特定情况下找到解决方案应该是完全不相关的,因为任何隐含的假设都可能在其他情况下导致错误。

【讨论】:

    【解决方案3】:

    在 Felix 中,容器从包的 0.0.0 版本开始,然后向上递增。然后它将连接到它命中的捆绑包的第一个版本。因此,如果您有两个包,版本 1.1.1 和版本 1.2.0,并且您尝试连接到该包但未指定版本号,则 Felix 应始终选择版本 1.1.1。

    【讨论】:

    • 规范不正确。 Felix 试图找到最佳的整体解决方案,而 OSGi 规范允许它有很大的余地。如果不指定版本号,则范围为 [0,∞)。假设有另一个包导入 [1.2,2)。在这种情况下,Felix 会将您的捆绑包连接到 1.2,因为它会最大限度地减少类空间的数量。但是,在 Felix 中,它也可以取决于安装顺序。
    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2015-11-07
    • 2014-10-08
    • 2011-02-16
    相关资源
    最近更新 更多