2014-11-06 73 views
0

我正在一个相当复杂的服务器应用程序中运行Tomcat/WAS等。它也运行在OSGi的上下文中。我的包使用了哪个版本的软件包?

这里是让我非常困惑的场景:(我慢慢地想吸收OSGi的细节)。

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

我正在处理另一个包中的代码,称之为“Bundle 2”。这个包在其类路径中包含一个包含不同版本“包1”的jar,我们称之为“包1版本2”。此外,“Bundle 2”导出“Package 1 Version 2”,以便我可以使用的其他一些捆绑包可以使用它。

问题是每个软件包会看到哪个版本的软件包?
- 其中一个软件包“Bundle 1”我无权访问 -I可以控制3个软件包:2需要导入实际导出“Package 1 Version 2”和“Bundle 2”的软件包2版本2“。

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

对于“Require-Bundle”中列出的所有软件包,它将采用它首先看到的软件包。因此,如果“Bundle 2”是Require-Bundle清单条目中唯一发生的bundle,那么它将使用由“Bundle 2”导出的bundle。另一方面,如果说一个捆绑包包括这个条目“Require-Bundle:BUNDLE_1,BUNDLE_2”,其中BUNDLE_1和BUNDLE_2都导出“Package 1”,那么由“BUNDLE_1”导出的版本将获胜并被使用。

我只是想检查一下,看看这听起来是否正确,如果有人知道一个很好的信息来源迅速解决这个问题。还要注意,我没有要求Bundle 1或Bundle 2的捆绑包实际上都需要包含一个Import-Package条目,因为它们只需使用“Require-Bundle”就可以访问这个包。

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

谢谢!

回答

1

我建议你应该检查OSGi维基网站。在Best Practices下有几篇很好的文章,讲述了Require-Bundle的问题。您应检查以下两个肯定的:

阅读这些文章后,您应检查的OSGi核心规范。在那里非常精确地描述了捆绑的解决方案。您应该检查规范的第三章,但如果您想快速了解解析过程,请参阅3.9.4整体搜索顺序一章。那里有一个真正自我解释的图表。

如果你是在要求束3.13分辨率需要捆绑的OSGi核心规范的章特别感兴趣。是你应该阅读的那个。

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

针对您的具体问题

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

+0

谢谢你的详细答案,并指出我在哪里可以找到这个信息! – user622511 2014-11-07 04:30:22