zoukankan      html  css  js  c++  java
  • 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中可以通过反射访问到业务插件的类了。

  • 相关阅读:
    [论文复现笔记]Im2Struct
    深度学习踩坑
    Matlab问题汇总
    Linux网络服务
    探索Blender
    [每日挖坑]20200728
    Ubuntu重启之后显卡挂了
    3D视觉知识点
    [每日挖坑]20200727
    遥感影像相关知识
  • 原文地址:https://www.cnblogs.com/anrainie/p/2523543.html
Copyright © 2011-2022 走看看