文/陈刚 from
www.ChenGang.com.cn at 2006年4月29日 (转载请标明出处)
起因是这样的,有一个已经开发了比较多功能的RCP程序,它包含这样几个模块:JMX浏览器(类似于MC4J的功能)、系统事件监控器、权限控制框架等。这些模块是写在一个RCP项目中的。
现在,我想更灵活些。比如,JMX浏览器模块这个是通用的,但如果谁要使用这个功能,就必须运行整个RCP项目才行,而我希望这个JMX模块是可简单装卸的。充分运行Eclipse的插件机制,让各模块成为一个独立的插件,应该可以实现这个功能。
比如,JMX模块形成一个独立的插件:它既可以让其他人当做一个普通插件,安装到Eclipse中;也可以成为一个模块,插入我RCP项目中来。这样的设计,让模块的开重用性变得很高了。
这个想法中,RCP部份,仅仅成为一个空壳,提供更插件的插入机制。这个方案特别适合那种想把原有插件项目,改装成RCP而发布的项目,基本上原有插件无需做改动。
然而这个想法是否可行呢?
(1) 插件能否想插入到Eclipse,插入到RCP空壳项目中?
(2) 插件中的如果存在依赖关系(比如,一个插件需要用到另一个插件的代码),怎么实现。
(3) 插件依然的JAR包怎么处理。比如有三个插件都要用到log4j.jar来输出日志,如果把log4j.jar放在插件项目的lib目录来使用的话,log4j.jar在三个插件各有一份,就会有三份。当三个插件合到RCP项目中时,就有两个log4j是冗余的。这会增在RCP项目的大小。
(4) RCP项目有一些界面元素须要根据插入的插件,做相应的变化。怎么实现?
为了验证第(1)点,我做了这个实验:
创建一个很简单的插件项目,此插件项目包含一个很简单的透视图。我要看看这个透视图能否出现在RCP项目中的。很顺便,当我把插件项目导出后,安装到RCP项目的plugin目录,再运行RCP项目,发现这个插件项目的透视图出现在了RCP项目的透视图列表中。
如果是开发时,我希望运行RCP项目时,就能看到插件项目插入进来后的效果。实现也不难,步骤如下:
(1) 在Plugin.xml的dependencies项,把插件项目加入到Required Plug-ins中。(表示项目的依赖)
(2) 在run..里的Plug-ins项,选择插件项目和RCP项目,并单击Add Required Plug-ins(表现运行时的依赖)
为了验证第(2)点,我做了这个实验:
在插件项目中创建一个类,在RCP项目中使用这个类,这时还是找不到类的。解决办法是:在打开插件项目的plugin.xml-->runtime选项卡-->Exported Packages(输出的包),把这个类所在的包加入进来。这下RCP项目可以使用插件项目的类了。
关于第(3)点,我没有做实验,我的想法是:把jar包封装成插件(可参考eclipse对junit的封装),从而将项目对JAR包的依赖,转变成对插件的依赖。
关于第(4)点,我没有做实验,我的想法是:通过自定义RCP项目的扩展点来实现。
在我这个项目分解模块还会遇到这样的问题:权限安全模块是影响到整个RCP项目的,但JMX模块独立出来后,显然不是必须要权限安全模块的。怎么解除这种依赖关系呢。我看是解除不了的了,但可以设一个开关,让权限安全模块失效。这样虽然代码和权限安全模块有依赖,但可以把权限检查的功能关闭。
总结:
这种方式虽然灵活,但也是有代价的---编程和项目管理更复杂了。