2010-10-29 30 views
0

我在學習OSGi,我很好奇以下情況:如何更新OSGI中的接口?

我想改變(大部分)由OSGi公開的接口,而不改變類名。是否有可能製作一個將舊界面「翻譯」爲新界面的軟件包。

下面是一個例子,我希望它已經足夠清楚了,只需使用一些清單標題即可。 假設我有這些OSGi bundle了:

Bundle-Name: Example Iface1 Implementation 
Import-Package: org.osgi.framework 
Export-Package: example.interfaces;version="1.0" 

Bundle-Name: Example Iface1 User 
Import-Package: org.osgi.framework, example.interfaces;version="1.0" 

但後來我需要更新公開接口(一個或多個)。 接口類別名稱保持不變,但添加了功能。 所以我創建:

Bundle-Name: Example Iface2 Implementation 
Import-Package: org.osgi.framework 
Export-Package: example.interfaces;version="2.0" 

我可以做這樣的bunlde翻譯的新界面到老了,需要捆綁?

Bundle-Name: Interface Translator 
Import-Package: org.osgi.framework, example.interfaces;version="2.0" 
Export-Package: example.interfaces;version="1.0" 

因爲在這種情況下,我不知道該怎麼做Java中的進口...

還是有更好的方法做處理這種情況的OSGi?

回答

3

有沒有必要這樣做,但你確實需要正確指定你的版本。

您的第一個版本的軟件包導出「example.interfaces」版本1.0。這可以。用戶包應該導入版本「[1.0,2.0)」。換句話說,1.0直到但不包括2.0版本。

現在你說你想添加一些方法到接口。這種變化對於界面的消費者來說是向後兼容的,但對於生產者來說則不是。指出這種變化的方式是顛覆版本的第二部分,即「次要」部分。所以你更新的接口包應該導出「example.interfaces」版本1.1。

現在,您的新版本界面可以直接由用戶捆綁使用,因爲1.1屬於範圍[1.0,2.0)。沒有必要導出與1.0相同的接口 - 實際上你不能這樣做,因爲這意味着接口沒有改變。但它已經改變了,對生產者來說是一種倒退不相容的方式。

例如,假設您有一個實現原始接口的生成器包。它應該使用以下導入範圍:[1.0,1.1)。該捆綁包不能看到更新的接口,因爲它不能實現新的方法,並且實際上它不會看到更新的接口,因爲1.1超出了範圍[1.0,1.1)。如果你編寫一個支持更新接口的新生產者,它必須使用範圍[1.1,1.2)。

有關如何指定導出版本和導入範圍的更多詳細信息,請閱讀OSGi Semantic Versioning paper(PDF警告)。

+0

我不知道語義版本控制。這在大多數情況下提供了一個好方法!但是,我仍然想知道是否有一種方法可以在主要版本更改之間進行「翻譯」。這種變化是後向不相容的,但可能有辦法解決這個問題。 – 2010-11-03 07:59:50