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 @   荒土  阅读(1743)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示