2014-11-06 76 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