我的捆绑包使用了哪个版本的软件包?

时间:2014-11-06 20:47:53

标签: java plugins osgi

我正在研究一个在Tomcat / WAS等运行的相当复杂的服务器应用程序。它也在OSGi的上下文中运行。

这个场景令我非常困惑:(我慢慢地试图吸收OSGi的细节)。

"捆绑1" - 此捆绑包由另一组开发人员管理,我无法触摸它。不幸的是,它会导出某个包,称之为"包1版本1"。

我正在处理另一个包中的代码,将其称为" Bundle 2"。该捆绑包在其类路径中包含一个jar,其中包含不同版本的" Package 1",让我们称之为" Package 1 Version 2"。此外,"捆绑2"出口"包装1版本2"以便我可以访问的其他一些捆绑包可以使用它。

问题是每个捆绑包会看到哪个版本的包? - 其中一个捆绑包"捆绑1"我无权访问 - 我可以控制3个捆绑包:2个需要导入"包1版本2"和"捆绑2"实际上导出"包1版本2"。

一般来说,它可以预测选择哪个版本?我目前的理解是它应该如下工作:

对于" Require-Bundle"中列出的所有捆绑包,它将采用它首先看到的捆绑包。因此,如果"捆绑2"是Require-Bundle清单条目中唯一的捆绑包,然后它将使用" Bundle 2"导出的捆绑包。另一方面,如果说捆绑包括此条目"要求捆绑:BUNDLE_1,BUNDLE_2",其中BUNDLE_1和BUNDLE_2都导出"包1和#34;,那么由&导出的版本#34; BUNDLE_1"将赢得并被使用。

我只是想检查一下这听起来是否正确,是否有人知道一个很好的信息来源,以便快速解决这个问题。另请注意,我所拥有的需要Bundle 1或Bundle 2的捆绑包实际上都不需要包含Import-Package条目,因为只需使用" Require-Bundle"它们就可以访问包。

到目前为止,我的测试表明上述陈述是正确的,但并不全面。

谢谢!

1 个答案:

答案 0 :(得分:1)

我建议您查看OSGi wiki网站。在Best Practices下有几篇好文章讲述了Require-Bundle的问题。您应该检查以下两项:

阅读完这些文章后,您应该查看OSGi Core规范。在那里非常精确地描述了束的分辨率。您应该查看规范的整个第三章,但如果您想快速了解解决过程,请参阅 3.9.4整体搜索顺序章节。那里有一张真正自我解释的图表。

如果您对解决 Require-Bundle 3.13要求捆绑 OSGi核心规范的章节特别感兴趣。是你应该阅读的那个。

最好的来源是规范本身,而不是谷歌和博客。

针对您的具体问题

很难读取捆绑包之间的连接。可能如果您从捆绑包中共享一些MANIFEST头文件,则更容易找到接线。但是,简短的回答是避免 Require-Bundle ,你甚至不会有这样的问题。