Feeling

    三人行,必有我师焉

   ::  :: 新随笔 :: 联系 ::  :: 管理 ::
  85 随笔 :: 0 文章 :: 392 评论 :: 0 Trackbacks

网上关于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路线。由于网上相关文章不多,还需要自己多多研究,了解其机制。

posted on 2009-09-10 16:42 三人行,必有我师焉 阅读(1668) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
GitHub |  开源中国社区 |  maven仓库 |  文件格式转换