最近同事被一個問題困惱了很久,讓我?guī)兔聪?/span>,問題是這樣的,我們的平臺是基于Eclipse RCP 3.3.0,將每個功能模塊作為一個插件工程,系統(tǒng)提供了基于Http的自動更新插件的功能,要求在插件更新完成后將舊版本刪除掉(我們自己寫的版本比較方法),本來一切運(yùn)行正常,但是負(fù)責(zé)部署的同事將插件系統(tǒng)的版本號升級成4段,比如以前的版本組成是“主版本號.次版本號.內(nèi)部版本號”現(xiàn)在發(fā)展到“主版本號.次版本號.內(nèi)部版本號.構(gòu)建版本號”比如將"3.0.0100"升級到"3.0.0100.1",這時候自動刪除舊插件的功能就運(yùn)行的不正常,比如插件中有個主插件版本號為3.0.0100.9啟動后可以刪除版本號為"3.0.0100.8"的插件,而"3.0.0100.11"的插件卻無法刪除"3.0.0100.9"的插件。
其實這和OSGI的版本機(jī)制有關(guān)系,Eclipse內(nèi)部插件版本標(biāo)記和比較是通過"org.eclipse.osgi.*"插件中的Version.java完成的,Version 中的字段major表示主版本號、minor表示次版本號、micro表示微型版本號(內(nèi)部版本號),這三個字段的類型都是int型的,而Version中的qualifier用來表示構(gòu)建版本號,類型是字符串,當(dāng)時如果第四位構(gòu)建版本號如果是純數(shù)字的話,Eclipse會自動格式化一下,再進(jìn)行比較,比如比較08和10,格式之后變成8 vs 10,通過字符串的compare方法會得到8比10大7,當(dāng)然它就會認(rèn)為"oss.client_1.1.1 .08"的版本要比"oss.client_1.1.1.10"高,這可能是Eclipse 3.3.0 版本的一個Bug,我在Eclipse 的3.3.2中沒有發(fā)現(xiàn)這個問題,在Eclipse 3.4和 3.5也已經(jīng)修復(fù)好了,如果你使用的是Eclipse 3.3.0并且也有這樣的需求的話要小心了。
其實這和OSGI的版本機(jī)制有關(guān)系,Eclipse內(nèi)部插件版本標(biāo)記和比較是通過"org.eclipse.osgi.*"插件中的Version.java完成的,Version 中的字段major表示主版本號、minor表示次版本號、micro表示微型版本號(內(nèi)部版本號),這三個字段的類型都是int型的,而Version中的qualifier用來表示構(gòu)建版本號,類型是字符串,當(dāng)時如果第四位構(gòu)建版本號如果是純數(shù)字的話,Eclipse會自動格式化一下,再進(jìn)行比較,比如比較08和10,格式之后變成8 vs 10,通過字符串的compare方法會得到8比10大7,當(dāng)然它就會認(rèn)為"oss.client_