一、Eclispe插件体系结构概述

Eclispe是世界上最大的开源组织的产品,是一个基于Java的可扩展的开发平台,就其本身来说,它只是一个框架和一组服务,用于通过组件构建开发环境。

Eclipse 是一个全能的工作平台,主要得益于其插件体系结构。整个Eclipse采用平台加插件体系结构,Eclipse Platform Runtime作为整个系统的基础,是一个专门为插件提供的运行时容器,其本身不具备任何面向用户的业务功能。就像一个常见的J2EE容器,如果没有应用,那么也就是一个纯粹的中间件。同样如果没有插件,Eclipse平台的运行时就是一个纯粹的容器。所有的业务功能,都是封装在Eclipse 的插件中中的Workspace,Team,JDT(Java开发工具包)和PDE(插件开发环境)本身就是用插件来实现的。Eclipse系统架构图如下。

https://p-blog.csdn.net/images/p_blog_csdn_net/songliwei2005/EntryImages/20080717/blog.JPG

由于Eclipse 采用了完全开放的扩展方式,在熟练的程序员手里,Eclipse更像一个高级的玩具,你可以自由实现你想要的功能,唯一的束缚可能就是你的想象力了。Eclipse的给我们带来最重要的思想就是微内核与可扩展的插件体系结构。与Eclipse几乎同时代崛起的JBoss采用的也是微内核的可扩展机制,JBoss的流行带来的JMX 的流行,JMX规范使得基于Java的应用框架或中间件平台常常会采用这种流行的可扩展方式。但是JMX本身作为一个规范,其过高的抽象程度虽然带来了更多的灵活性,但是降低了开发时的效率,对于诸如应用服务器这样的中间件虽然适用,但是对于Eclipse 这样面向应用的中间件(或者说是面向插件),JMX的级别显得有些原始。而Eclipse的插件机制更为彻底,也更为具体,因此在特定的平台上,具有更方便的使用性。当应用服务器发展风头正劲的21世纪初期,Eclipse的出现无疑让人们对中间件的看法更加深化。Eclipse被设计成一个中间件服务器,每一个插件就是一个运行在Eclipse 规范上的应用包,中间件并不会为你提供服务,而真正的业务

工作都是运行在中间件中的业务模块。它将这种插件模式发挥到了极至。Eclipse

内核只是一个纯粹的插件运行环境,而我们常常看到的Eclipse各项功能,其实都是体现在那些林林总总的Eclipse 插件中的。

为什么水平的分层机构和微内核可扩展的机制会成为如此受欢迎的流行因素呢?计算机界的一位泰斗曾经解释说“增加一个中间层可以解决软件中的大部分问题”。垂直的体系结构具有比较弱的可扩展能力,对于开发,测试等等都会带来发散的结果。在面向对象的软件世界里,适当的层次结构就成为我们降低耦合,增加扩展性的有力工具。其实插件的结构在软件行业中并不是一个很新的概念,早期的计算机系统,软件硬件是一体的,那时候的应用软件是固化在硬件中的逻辑,随着操作系统和编译程序的发展,软件,硬件的体系结构才相对独立,而应用软件和硬件之间的平台就是操作系统。此时,各种应用程序就是运行在操作系统之上的插件,操作系统就是一个插件平台。而现代的中间件和Eclipse 这样的平台不过是操作系统之上的另外一种插件容器。

从Eclipse3.0以后,Eclipse就采用OSGI来作为其插件体系结构实现的基础。OSGI是一套开放的标准,Eclipse引入OSGI主要是考虑网络范围内的互操作性。每个Eclipse 的插件都是一个OSGI 的模块,Eclipse 的平台核心就是一个OSGI的参考实现。在最近的版本中,OSGI 的参考实现已经从内核中被剥离,形成了一个新的子项目:Equinox-an OSGi framework。一个OSGI 模块最重要的就是Bundle和Service,我们可以认为Bundle是一种插件管理器,主要是通过BundleActivator管理模块的生命周期,而Service 则是这个模块可暴露对外的服务对象。这里体现了OSGI和传统的Plug-in Framework不同的一个地方,管理和静态结构分开,每个Bundle 拥有自己的ClassLoader 以及context,通过context可进行服务的注册、卸载等,这些操作都会通过事件机制广播给相应的其他的Bundle;一般来说都为通过在Bundle 中编写初始需要注册的服务的方法来完成Bundle可供外部使用的服务的暴露功能。

启动时Eclipse 核心会检查所有的插件并注册,但是直到被调用,该插件的才会被实例化,这也就是我们常说的懒加载。Eclipse启动后,插件处于等待激活和被调用状态,由程序激活插件的功能,或用户输入会造成插件的初始化的事件等,从而实现预定的功能,这一点和一般的应用程序开发本质上没有区别,只不过以前我们开发应用程序,完全是Case by case, 也就是各为其主,现在如果你决定投身到Eclipse 的世界中,你就要树立这样一种世界观,即所有的功能都是通过插件来实现的,你的应用程序不过是Eclipse 平台运行时和你的插件的集合。

在Eclipse中有一个契约以保证插件能够和插件的容器通信,既拥有一个完整的插件开发和配置规范。这里首先需要一个抽象的插件定义,基础平台只通过固定的抽象接口和具体的插件交互,在平台的眼里,是不应该知道不同的插件的差别的。平台和插件(包括插件与插件通过平台的)的交互通过固定的接口实现,而用户与插件的交互则是通过插件本身对UI事件的响应来实现的。扩展(Extension)是Eclipse中一个关键的机制,插件利用扩展向Eclipse 平台添加新功能。但是扩展不能随意地创建,必须按照扩展点(Extension Point,参照图一中插头的标记)定义的规范进行明确的声明,Eclipse才能识别出这些扩展。所谓扩展点,就是Eclipse 定义出来可以让你扩展的地方,可以认为是一些扩展的契约;而扩展,这是你对这些扩展点的实现,当然你自己的插件也可以定义扩展点供别的开发人员扩展。我们不仅可以使用Eclipse提供的众多现成的扩展点,而且还可以定义新的扩展点,并在该扩展点上进行扩展。Eclipse平台本身的实现定义了很多的扩展点供你扩展,你可以从多个角度进行扩展,常见的扩展点有:

◆ 动作集(actionSet);

◆ 编辑器(editor);

◆ 弹出式菜单(popUpMenu);

◆ 视图(views);

◆ 透视图(perspectives);

◆ 属性页(propertyPages)等。

你可以认为一个扩展点就是不同的插件和Eclipse 平台绑定的契约,而扩展则可以认为是一个具体的绑定,一个扩展点会有多个扩展。举个例子,Eclipse提供了一个视图的扩展点,因此我们平台的很多视图都是对该扩展点的扩展,那么如果你的插件扩展了视图扩展点,那么系统就会明确的知道你一定有一个视图,并且该视图要实现特定的接口,以保证平台能够加载并显示它,但是视图本身的逻辑和要展现的内容,平台则不会关心。这也反映了一种互操作的通用设计原则,即规范化的接口和配置。举个简单的例子,EJB 容器和EJB 本身的交互,很多时候就要通过EJB规范的接口及事务,安全等的配置来实现,这种接口和配置的规范越简单,其灵活性越好但是开发的代价越高。因此在现实中需要某种平衡。比如,Servlet 只定义了简单的DOGET和DOPOS这样的接口,虽然简单灵活,但是开发成本则随之增加,所以有了JSP这样复杂一些的规范,但是可以简化开发。在JSP 的基础上,我们很快又有了Struts 等这样的框架,复杂程度更上一层,但是开发的效率则又有提高。Eclipse 通过大量的插件和扩展点很好地实现了这种平衡,一旦掌握了这种开发技巧和思维方式,基于Eclipse 项目本身的优秀插件和无数的开源插件,你的开发效率将得到很大的提高。

那么我们的插件应该如何来组织和编写呢? Eclipse 的平台价值就在于他已经准备好了被扩展,因此提供了完整的插件开发环境,也就是我们常说的PDE。事实上,开发Eclipse 程序的核心任务主要包含创建实现一个或者多个扩展的插件。我们看见很多的平台因为没有一个易用的开发工具而淹没在茫茫的代码中,幸亏Eclipse 提供了一个非常好用的插件开发环境(P D E)。P D E 是作为Eclipse SDK的一个部分而存在的,它本身的实现也是通过一组插件来实现的。如果你需要创建一个插件,你就必须打开PDE透视图,为你的插件新建一个Plug-in 项目。插件项目具有一些特定的配置,比如说它们每一个都有一个插件描述符(一个manifest和/或一个plugin.xml 文件),一个基于描述符指定的依赖关系的动态classpath,特殊的编译器,和其他配置属性。PDE提供了一个插件创建向导,可以选择各种需要的部分创建插件项目。从开发人员的直觉来看,所谓的插件就是一些符合接口的类的集合和一些配置文件定义交互的关系。我们当然可以手写配置文件,但是使用PDE的可视化编辑器工作起来效率更高。插件Manifest编辑器用到3 个文件:MANIFEST.MF,plugin.xml和build.properties.它允许你编辑所有必要的属性来描述一个插件,它的基本运行时要求,依赖,扩展,扩展点等等,当开发插件的时候你需要做更详细的了解。

由于Eclipse的兴起,直接给Java IDE市场带来深远的影响,基于完全开源的Eclipse Java IDE,一些商业公司发布自己IDE产品(如WSAD,MyEclipse,RAD以及国内一些厂商的IDE等)。目前的JavaIDE领域,Eclipse占据绝对优势,今年2月份连著名的开发工具厂商Borland 都宣布要出售开发工具部门,未来的JBuilder将怎样,还是一个未知之数。与此同时,Eclipse 的发展直接带动了第三方插件市场的发展。管国外有很多著名的开源Eclipse 插件,但一些商业性质的插件也在新兴的市场上站住了脚。对国内的软件公司,这未尝不是一个好机会,比如国内的中创软件,就正在从事这方面的一些工作。尽管中国的插件市场还有很多困难需要克服,但是我们期待国内的软件公司能在Eclipse 插件领域有所成就。

Eclispe 体系结构综述(一)相关推荐

  1. 通用计算机系统的工作方式,通用计算机操作系统典型体系结构综述

    摘要:随着操作系统应用领域的扩大,以及操作系统硬件平台的多样化,操作系统的体系结构和开发方式都在不断更新,目前通用机上常见操作系统的体系结构有如下几种:模块组合结构.层次结构.虚拟机结构和微内核结构. ...

  2. 面向人工智能的计算机体系结构

    来源:计算机研究与发展 前 言 近几年来人工智能技术的飞速发展使得其应用迅猛扩大,而传统的计算机体系结构对于面向人工智能的应用在处理速度.能耗.使用的方便性等方面有着诸多不足.随着人工智能应用的发展, ...

  3. 2019年智能科学与产业综述论文盘点

    来源:计算机研究与发展 2019年综述论文盘点 1.智能芯片的评述和展望(韩栋,周聖元,支天,陈云霁,陈天石) 2.闪存存储的重构与系统构建技术(陆游游,杨者,舒继武) 3.基于动态权衡的新型非易失存 ...

  4. Windows Server Containers 支持 Windows 开发者使用 Docker

    在过去几年里,Docker 和容器已成为全球开发界和企业最热门的话题之一.去年秋天发布的 Windows Server 2016 支持 Windows 开发者使用容器,使得这一热门话题再次升温.Win ...

  5. 面试/笔试第一弹 —— 计算机网络面试问题集锦【转】

    (转自:https://blog.csdn.net/justloveyou_/article/details/78303617) 写在前面: 找工作告一段落,期间经历了很多事情,也思考了许多问题,最后 ...

  6. c语言消隐的作用是什么,【C语言程序设计最终版材料】

    C语言程序设计(最终版) <C语言程序设计.doc>由会员分享,可免费在线阅读全文,更多与<C语言程序设计(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿 ...

  7. 计算机网络面试问题集锦

    1.Http和Https的区别 Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份:Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SS ...

  8. 面试/笔试第一弹 —— 计算机网络面试问题集锦

    写在前面: 找工作告一段落,期间经历了很多事情,也思考了许多问题,最后也收获了一些沉甸甸的东西 -- 成长和一些来自阿里.百度.京东(sp).华为等厂子的Offer.好在一切又回到正轨,接下来要好好总 ...

  9. 计算机组成与设计 有意思的句子

    前言 我们能体验的最美好的东西是神秘的事物.他是所有真正艺术和科学的来源. --阿尔伯特·爱因斯坦 <我的世界观>,1930 第1章 计算机概念和技术 增多我们不加思索就能完成的重要工作的 ...

最新文章

  1. SpringCloud(第 029 篇)配置客户端 ConfigClient 接入配置服务端
  2. vc udp 广播接收和发送_UDP编程与DatagramSocket类:UDP的套接字
  3. java中的左值右值_利用左值右值实现树状结构
  4. oracle 触发器的种类和触发事件
  5. 华为推出鸿蒙超级系统,华为鸿蒙系统正式发布!十个人里竟然只有两个人支持?...
  6. 为ASP.NET 2.0网站生成唯一程序集
  7. 中科研研究生:从算法工程师转行产品经理之后
  8. 360 php SQL注入,php中sql注入漏洞示例
  9. 二十一、 Memento 备忘录(行为型模式)
  10. R 语言 optim 使用
  11. 如何利用【百度地图API】,制作房产酒店地图?(上)——制作自定义标注和自定义信息窗口
  12. E4A(易安卓)学习——第一个APP
  13. 华为p8 root android6,华为p8青春版root教程【图解】
  14. 怎样理解ZBrush中的2.5D绘画
  15. charles(抓包神器)
  16. We're sorry but vue_blog doesn't work properly without JavaScript enabled. Please enable it to.....
  17. 我在智联招聘上的行为测试
  18. Python编程从入门到实践:动手试一试8-3T恤
  19. 295-光纤数据收发 隔离卡 加速计算卡 基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡
  20. R及R Studio下载及简单介绍(界面+R语言)

热门文章

  1. 一个js实现银行卡号*格式化方法的演变
  2. js日期格式2020-10-10或者2020/10/10
  3. 电子货架标签----云架构
  4. 解除word受编辑限制
  5. 虚函数表 以及 虚函数表的继承过程
  6. 多媒体计算机采用的数字化,数字化学习中运用多媒体(下)
  7. 基于组态王组态锅炉控制系统研究与仿真控制
  8. 魔百盒配置服务器信息,中国移动魔百盒网络连接图文教程
  9. Photoshop作品欣赏
  10. 2016年12月29日 星期四 --出埃及记 Exodus 21:24