還記得剛接觸插件開(kāi)發(fā)不久的時(shí)候,加上看了點(diǎn)OSGI協(xié)議(其實(shí),當(dāng)時(shí)根本看不懂~_~),留下了如下的錯(cuò)覺(jué):
1、我的插件在不用的時(shí)候會(huì)被自動(dòng)stop的。例如我的插件主要貢獻(xiàn)了一個(gè)自定義的編輯器,如果用戶把我提供的編輯器都關(guān)閉了,我的插件會(huì)馬上被自動(dòng)stop掉;用戶過(guò)會(huì)再打開(kāi)的時(shí)候,我的插件會(huì)再啟動(dòng)回來(lái)
2、基于以上觀點(diǎn),我的資源釋放就放在我的Plugin.stop中,反正會(huì)馬上被釋放(不管eclipse實(shí)例--osgi framework--是否退出)
3、...
想想當(dāng)初,當(dāng)時(shí)是把OSGI協(xié)議中的bundle生命周期管理想象的過(guò)于神話了。可能是不想輕易放棄自己的觀點(diǎn),所以后來(lái)特意又仔細(xì)看了兩次OSGI協(xié)議,里面確實(shí)講了Bundle會(huì)被stop,而且如果stop的過(guò)程中發(fā)生異常,osgi framework會(huì)怎樣處理云云......但是,翻了幾遍也只發(fā)現(xiàn)了默認(rèn)兩種情況下Bunlde會(huì)被stop:
1、OSGI framework退出的時(shí)候。映射到Eclipse插件開(kāi)發(fā)場(chǎng)景下,也就是說(shuō)當(dāng)Eclipse實(shí)例退出的時(shí)候,我們的Plugin肯定會(huì)被stop
2、在支持osgi控制臺(tái)的協(xié)議實(shí)現(xiàn)中,用戶可以通過(guò)_stop來(lái)強(qiáng)制stop一個(gè)bundle。(這種情況,在Eclipse插件開(kāi)發(fā)的場(chǎng)景下,就不討論了)
難道讓我自己去判斷我的插件是否被使用了,然后自己stop自己???
看來(lái)有點(diǎn)心灰意冷了,自己想要的那種自己的Eclipse插件會(huì)在不用的時(shí)候馬上stop,用的時(shí)候再馬上start的效果(注明:在osgi framework即Eclipse實(shí)例一直運(yùn)行的情況下)是不存在的。于是,有點(diǎn)不相信協(xié)議了,就直接去翻了一下Eclipse對(duì)osgi的實(shí)現(xiàn)代碼,發(fā)現(xiàn)Bundle.stop被調(diào)用的地方非常少,總結(jié)一下基本上兩種情況:
1、osgi framework在用,在framework退出的時(shí)候,stop掉俺的插件
2、FrameworkCommandProvider在用,那不用說(shuō)了,就是osgi控制臺(tái)命令行在使用了
Eclipse,難道你即時(shí)動(dòng)態(tài)地判斷一下俺的插件是否可以被stop就這么難嗎?
確實(shí)很難,關(guān)于這個(gè)問(wèn)題過(guò)兩天閑下來(lái)會(huì)寫(xiě)個(gè)豆腐塊文章來(lái)大膽地揣測(cè)一下(這可能涉及到了osgi對(duì)狀態(tài)支持等...)
說(shuō)到這邊,有人可能會(huì)問(wèn)了?為什么不在程序里面強(qiáng)制調(diào)用Bundle.stop來(lái)stop掉自己想stop的插件呢?
關(guān)于這個(gè)問(wèn)題的原因也挺復(fù)雜的,插件的上下文環(huán)境、目標(biāo)插件所處的位置......總之,如果不是osgi那塊的高手,在做Eclipse插件開(kāi)發(fā)的過(guò)程中,最好不要這么做!!!
現(xiàn)在
,我們基本可以瞑目了,對(duì)一般Eclipse插件開(kāi)發(fā)者,請(qǐng)記住如下可能看起來(lái)不是太嚴(yán)謹(jǐn)?shù)慕Y(jié)論吧:
的確,你的插件會(huì)被lazy start,但是一旦start了,就等到Eclipse實(shí)例退出的時(shí)候stop吧。
再想想以前犯的錯(cuò)誤:把心想馬上釋放的資源直接丟到了Bundle.stop中。那知道,直到Eclipse實(shí)例退出的時(shí)候,它才被執(zhí)行啊....
本博客中的所有文章、隨筆除了標(biāo)題中含有引用或者轉(zhuǎn)載字樣的,其他均為原創(chuàng)。轉(zhuǎn)載請(qǐng)注明出處,謝謝!