我正在一个相当复杂的服务器应用程序中运行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”就可以访问这个包。
到目前为止,我的测试表明上述陈述是真实的,但并不全面。
谢谢!
谢谢你的详细答案,并指出我在哪里可以找到这个信息! – user622511 2014-11-07 04:30:22