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中可以通过反射访问到业务插件的类了。