子在川上曰

  逝者如斯夫不舍昼夜
随笔 - 71, 文章 - 0, 评论 - 915, 引用 - 0
数据加载中……

RCP最灵活的模块组织方式

文/陈刚 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模块独立出来后,显然不是必须要权限安全模块的。怎么解除这种依赖关系呢。我看是解除不了的了,但可以设一个开关,让权限安全模块失效。这样虽然代码和权限安全模块有依赖,但可以把权限检查的功能关闭。


总结:

这种方式虽然灵活,但也是有代价的---编程和项目管理更复杂了。

posted on 2006-04-29 12:40 陈刚 阅读(2519) 评论(10)  编辑  收藏 所属分类: Eclipse

评论

# re: RCP最灵活的模块组织方式  回复  更多评论   

我买了你的书,一个很严重的问题,《Eclipse从入门到精通》上的网址www.chengang.com.cn根本无法访问,可能你的域名解析出问题了,
我是通过百度快照找到这里来的,http://www.baidu.com/s?ct=0&ie=gb2312&bs=updates5.0net.zip&sr=&z=&cl=3&f=8&wd=www.chengang.com.cn%2F
2006-05-15 14:21 | 农民

# re: RCP最灵活的模块组织方式  回复  更多评论   

不错,写得很好!
"关于第(3)点:把jar包封装成插件(可参考eclipse对junit的封装),从而将项目对JAR包的依赖,转变成对插件的依赖。"
能不能说得详细点.因现在做的项目正有这样的需要。先谢了。
2006-06-06 15:32 | limeiyong

# re: RCP最灵活的模块组织方式  回复  更多评论   

文中的四点想法对我现在所从事的项目具有很大的借鉴意义。
我的RCP应用已经实现了扩展应用。关于第(1)点的验证:
按1.1的方法验证:但是按照你说的第一点修改的时候:既RCP是一个独立的应用程序,我将它原来所利用到的插件(在同一个工程中定义的插件)制作成一个独立插件,然后将此插件放到该RCP应用程序的plugin目录中,却没有实现扩展。
按1.2的方法验证:可以实现扩展,同时还发现可以通过增加config.ini文件中的jar包引用实现扩展。但是这种方式的扩展对插件的加载是不受控制的,就是什么时候加载哪个插件我是不知道的。
请问如何解决以上问题?谢谢!
2006-06-06 21:09 | dew_chx

# re: RCP最灵活的模块组织方式  回复  更多评论   

以上的1、2点实验成功。谢谢本文作者,继续关注3、4的实现。
不过还有一个疑问:就是我想在自己的RCP应用程序中自定义一个透视图扩展点,其他的透视图插件实现该扩展。如果能够实现的话,我就可以控制插件的加载过程。
2006-06-13 10:28 | dew_chx

# re: RCP最灵活的模块组织方式  回复  更多评论   

你的书不错,我最近在学习!
2006-12-13 10:26 | 服务器超时

# re: RCP最灵活的模块组织方式  回复  更多评论   

博主,你好。
我根据你的对第一点想法的做法也做了一个实验,但没成功。不知道是怎么回事,请教一下。
你在博文中说:“创建一个很简单的插件项目,此插件项目包含一个很简单的透视图。我要看看这个透视图能否出现在RCP项目中的。很顺便,当我把插件项目导出后,安装到RCP项目的plugin目录,再运行RCP项目,发现这个插件项目的透视图出现在了RCP项目的透视图列表中。”
我按照你的做法,实验步骤如下(我用的是eclipse3.3 europa):
1,新建一个插件工程,用的是hello word模板,此模板的功能为添加窗口添加了一个“sample menu”菜单,并有一个菜单项。
2,新建了一个rcp 插件工程,用的是view模板。
3,将1所建的插件工程导出为deployable plug-ins and fragments.得到一个plugins文件夹,里面为一个jar包。
4,在rcp工程下,新建一个lib文件夹,将3所得的jar包拷贝到文件夹中。然后在plugin.xml-》runtime选项卡的classpath中加入此jar包。在buid选项卡中将lib,bin勾上。
5,对rcp工程进行以eclipse application 方式运行,但结果去只有2的结果,1的结果没有加上去。

对你说的在开发的时候怎么加载我也做了实验,实验成功了。
请指点一二。不甚感激。
2007-08-21 20:24 | yqouyang

# re: RCP最灵活的模块组织方式  回复  更多评论   

@yqouyang
@limeiyong
@dew_chx

这篇文章的更细节的内容,在《Eclipse从入门到精通》的第二版的第33章有论述。
2007-08-25 11:33 | 陈刚

# re: RCP最灵活的模块组织方式  回复  更多评论   

@陈刚
非常感谢。
2007-08-25 18:38 | yqouyang

# re: RCP最灵活的模块组织方式[未登录]  回复  更多评论   

谢谢楼主,在你那书学习到很多,不过现在有个问题就是,菜单通过配置生成的,怎么在菜单生成里加入权限呢!
2008-09-05 09:34 | 小刚

# re: RCP最灵活的模块组织方式[未登录]  回复  更多评论   

请问楼主,rcp里的权限应怎么权限呢,通actionset里配置的菜单,有没有办法加入权限,让有权限权限显视,无权限的不让显视呢....谢谢
2008-09-05 15:13 | 小刚

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


网站导航: