在Eclipse開發過程中,編寫插件啟動類(Activator)代碼時候的注意點,簡要列舉如下。
眾所周知,org.eclipse.core.runtime.Plugin類中最核心的兩個方法:start和stop,開發者通過覆寫這兩個方法,可以參與到osgi framework針對你貢獻的Bundle的生命周期管理。注意點和簡要理由列舉如下:
1、
start方法中只干必須要干的事情。不是插件啟動的必要條件的東西,一律不要防止到start邏輯中。根據
個人經驗,這種場景非常少,常用的功能是在AbstractUIPlugin啟動的時候申請系統資源。
【常犯的錯誤】
最近發現一些人寫start邏輯的時候,喜歡包含擴展加載的代碼(自己定義了一個擴展點,在插件啟動邏輯代碼中預加載擴展)。完全不必要這么做,第一操作Eclipse擴展注冊表本身是比較耗時的操作,而且如果加載的代碼邏輯中包含了創建類實例的代碼(IConfigurationElement.createExecutableExtension),很可能引起其他擴展插件的過早啟動
2、start方法中的自定義邏輯代碼一定要確保安全。否則,可能一個簡單的異常情況就使得你辛苦寫的插件當掉了~_~,而且會間接引起對應擴展插件也啟動不了
3、如果start方法中干了活有一定耗時的嫌疑,簡單的用時間戳測試一下大致的耗時
【常見的錯誤】
Eclipse底層在加載新類型的時候,會啟動一個新的線程,而且該線程設置的超時限制。Eclipse加載你貢獻的插件中的類型時,肯定要先啟動你的插件。如果你的啟動邏輯過于耗時,則有可能引起類加載超時的問題,最可惡的是,這種問題具有一定的偶然性
4、建議保存Eclipse默認提供的Plugin Activator。發現有些人喜歡刪除默認的啟動類,他感覺他的插件不需要編寫額外的啟動邏輯代碼。個人建議不要這么做,因為很多底層問題需要調試到插件啟動的層面來判斷,保留默認啟動類,便于調試和跟蹤插件的啟動
5、要假設stop方法只有在Eclipse實例退出的時候才被調用。關于這個問題的分析,最近兩天有時間我會額外寫一篇文章來分析一下(一般只有osgi framework在osgi應用退出的時候或者osgi console命令行管理中會調用這兩者,自己一般不要去調用)。
【常犯的錯誤】
不少開發者假設自己寫的插件真的會在不需要的時候被stop,這種想法過于天真。(首先如何判斷不被需要對osgi的實現者來說就是很大的挑戰,尤其是設計到有狀態服務等的時候....這個問題很復雜,以后有機會和大家討論)
6、在starp和stop邏輯代碼中,盡量不要去顯式敢于Eclipse對插件生命周期的管理。這可能會引起很多莫名其妙的問題(請相信我,我曾經很多次用Bundle.start來啟動我想啟動的插件,結果出現見鬼的問題。以后和大家分享)。
【常犯的錯誤】
開發者顯示調用Bundle的start和stop來控制一個目標插件,千萬不要輕易這么干!!!如果想預啟動,盡量使用Eclipse提供的startup擴展點,其在app laucher中會幫你預啟動。
其他的問題,一時想不起來了。希望對插件開發的同行有幫助!
本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!