網上關于Eclipse Fragment的資料比較少,引用Eclipse Wiki的一段話:
An Eclipse Fragment is a way of putting your own classes into the "class loader" of another package (basically, it's as though your class was actually in the other package). If you combine this ability of a Fragment with the notion of a plugin's classpath ordering, then you can force your class to load before a like-named class in the original package.
簡而言之,Fragment可以利用Eclipse平臺的ClassLoader機制替換原有Plugin的某些文件,以便實現自己的功能。如果僅僅是因為Plugin擴展,而需要替換自己項目的某些Plugin,可以參考文章:
http://wiki.eclipse.org/Steps_to_use_Fragments_to_patch_a_plug-in (來之不易,感興趣的可以收藏下)
讀完這篇文章,你大概就應該能夠了解到Fragment的實現分為兩部分:Host 和 Patch。這兩部分對應的plugin的manifest.mf文件都需要做特殊處理,對于Patch的build方式也要特殊處理,那就是build出來的plugin jar里放置的不是松散的class文件,而是一個特殊的jar文件,這個 jar 文件定義在Host plugin的manifest.mf 的classpath里面。
通常情況下,按照這篇文章的做法是沒有問題的。但是在開發階段,有一種情況可能無法實現class的替換。
我公司的項目是使用perforce進行項目版本控制的,但是perforce比較傻,有些重要的功能沒有實現,而又很關鍵,因此我想自己針對perforce的eclipse plugin做一個fragment,添加自己想要的功能。但是這個plugin沒有source code,而我自己的hack也是反編譯class文件進行的。所以在我的work space里,并沒有Host plugin的 project。結果按照這篇文章的做法,始終不能在workbench debug的狀態下,正確load我hack過的class。因為在代碼模式下面是可以正確load的,而現在沒有代碼,在數次檢驗無果之后,只能針對ClassLoader去思考了。Host文件里要求一個jar文件,我就用PDE 將 fragment export出來,把Fragment plugin jar 包里包含的那個 jar 文件解壓出來,放到 patch project 里,然后重新Debug, OK,這次果然沒問題了。一個小小的Class Loader問題,真的能夠要人命呀……這應當算是Eclipse的一個bug吧,除非是對一個Plugin進行hack,否則一般也不會碰到這種情況。普通的項目開發,肯定會包含Host Plugin的Project。
我的經歷權且當做飯后談資,不足為慮。我這兒想說的是Fragment機制非常好用,也易于Plugin擴展。比如你的項目分為Open Source 和 Commercial 2種的話, Commercial 部分也可以通過Fragment來實現,不一定需要走Extension Point路線。由于網上相關文章不多,還需要自己多多研究,了解其機制。