RCP Buddy简易实现

Eclipse有自己的一套ClassLoader机制

比如OSGI Bundle是符合OSGI规范的

同时,它还有一些额外的和Bundle机制不冲突的ClassLoader机制

比如Buddy

 

假设一下情况存在:

1、插件A需要被插件B依赖

2、插件A需要插件B的某些信息(类,资源)

3、插件A需要在本地ClassLoader中获得,而非通过Bundle获得(这是可能由于使用了某些依赖反射的第三方包)

 

我选择使用Buddy。

-----------------------------------------------自言自语的分割线---------------------------------------------------------

在我的问题里,遇到ClassLoader访问问题的是Hibernate。

我们知道Hibernate大量使用了Class.forName方法,如果要在Eclipse RCP中使用Hibernate并将之插件化(见在插件里应用hsqldb和hibernate

 

有以下插件:

1、ext.eclipse.hibernate(Hibernate配置插件和自定义工具集)

2、ext.eclipse.db.hsqldb(数据库插件,独立的数据库插件,维护自己的Hibernate数据库配置)

3、ext.eclipse.ide.auth(业务相关插件,内包含JavaBean)

4、ext.eclipse.ide.auth.intf(JavaBean接口插件)

 

插件1和插件2是单纯的依赖关系,但是Hibernate和JavaBean之间关系要复杂很多,首先JavaBean所在的业务插件不应该暴露出Bean所在的包,它对外提供的是一个工厂类

即是说,如果让Hibernate插件依赖JavaBean来通过Bundle机制访问Bean,就不可避免的暴露一些包。

再,从逻辑上说,Hibernate作为独立的业务无关插件,不应该依赖业务插件,而应该是反过来,需要使用Hibernate的业务插件依赖Hibernate。

------------------------------------------------------------------------------------------------------------------------

 

ok,下面说一下Buddy。

实现很简单:

1、在Hibernate插件的Manifest.MF文件加入定义:Eclipse-BuddyPolicy: registered

2、在JavaBean所在的业务插件的Manifest.MF文件中加入定义:Eclipse-RegisterBuddy: ext.eclipse.hibernate 以及 Require-Bundle: ext.eclipse.hibernate

 

如此就完成了配置,在Hibernate中可以通过反射访问到业务插件的类了。

 

posted @ 2012-05-29 10:14  荒土  阅读(1729)  评论(0编辑  收藏  举报