本文只是一篇翻译.其原创文章的标题是"Notes on the Eclipse Plug-in Architecture",URL联接为http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html,该文剖析了Eclipse插件系统的结构,为渴望了解Eclipse插件的程序员提供了有益的指导.希望我的这篇翻译能对大家理解该文有些帮助Eclipse插件架构笔记
概要
为建立组件级的应用,Eclipse插件系统包含了一个架构模式.本文以参与者和协作者的角色来介绍这一架构模式,目的是提供对插件的理解,插件是怎样被定义和处理的,以及使用Eclipse工作平台来独立生产插件的机制.
Azad Bolour, Bolour Computing
July 3, 2003
内容列表
1.简介
2.Eclispe插件模型
3.扩展处理
4.一个可扩展的算术函数服务实例
5.监听器扩展和观察者模式
6.摘要和总结
1.简介
Eclipse是一个可扩展的IDE平台.为了控制工具组协同工作以支持程序任务,它提供了一个核心服务.工具建立者可以把他们的,被称为Eclipse plug-in的,并符合Eclipse插件规范的可插组件封装进Eclipse平台中.Eclipse的一个基本的可扩展机制是,新插件可以添加处理元素到已存在的插件中,Eclispe也提供一组核心插件来启动这一处理.
尽管Eclipse是个IDE平台,但是它的思想和组织架构的核心是支持一个通用模型,该模型可为多个开发者建立组件级的应用.对Eclipse中的这一系统组件的通用模型的内容将在本文的软件模式部分中描述.本文旨在为新插件开发者,如需要全面理解插件模型(像插件怎样工作的,怎样让插件协同工作)的开发者.
本文的结构如下.第二部分略述了Eclipse插件模型和插件的声明性规范以及他们在这一模型中的关系.第三部分解释了插件开发者必须做什么才能允许他们的插件生效.第四部分提供了一个完整的插件例子.第五部分比较了Eclipse插件模型和相对简单的观察者模式.第六部分概述了 Eclipse插件中的主要架构思想以总结本文.
本文并不涉及用户使用Eclipse插件开发环境(PDE)来建立和测试插件.关于这方面的内容请参照其它的在线文档.
2. Eclipse插件模型
Eclipse 插件是一个在Eclipse工作平台中提供某些服务类型的组件.这个组件就是一个可以在系统部署期间被配置到系统中的对象.Eclipse运行组件提供了支持一组在无缝环境中进行开发活动以协同工作的插件激活和操作的基础设施.简单地说,在一个Eclipse运行实例中,一个插件是被包含在某些插件运行类或插件类的实例中.插件类为插件实例提供了配置和管理支持.Eclipse中的插件类必须继承org.eclipse.core.runtime.Plugin类.它是一个为管理插件而提供有通用工具的抽象类.
Eclipse安装目录包含有部署有单个插件的插件文件夹.在插件文件夹下,每一个插件又被安装在它自己的文件夹下.插件被描述在一个XML清单文件中,称为plugin.xml,它被放在插件文件夹下.这个清单文件告诉Eclipse运行组件它需要激活该插件的信息.
插件清单文件的解析内容可编程地存储在plug-in registry API中.被解析的插件定义被缓存在称为plug-in registry的内存容器中.通过使用plug-in registry API, Eclipse运行组件实例化每一个插件实例. plug-in registry API也被自己的插件代码用来获取插件信息.
这是一个最小的插件清单文件:
name="JUnit Testing Framework" id="org.junit" version="3.7" provider-name="Eclipse.org">
Listing 2.1. A Minimal Plug-in Manifest File.
|
这个清单文件描述了Eclipse工作平台中的JUnit测试框架服务.(注意:为了增强可读性,这个清单文件的内容是在本文的英文本地化环境中被复制的)
Eclipse平台插件清单规范文档化了在定义插件中用到的XML元素和属性.(该规范可以在Eclipse平台的帮助文档中找到.)
这里,本文并不关注插件清单文件的内容,插件的唯一标识符(XML属性id)除外.插件标识符被用来引用清单文件中的,或其他相关的插件.插件标识符也可以用来在自己的插件代码中访问插件的运行实例.例如:
Plugin p = Platform.getPlugin(pluginID);
Eclipse运行组件管理插件实例,插件实例可以像如上方式被Eclipse平台使用.插件实例不能被应用程序构建.
2.1. 插件部署和激活
在Eclipse中部署一个插件就是,把插件文件资源(清单文件,jar文件及其他资源)拷贝到Eclipse插件目录下.这个插件就可以在它需要起作用的时候被Eclipse运行组件激活.插件激活意味着导入,实例化和初始化插件运行类.
插件类的主要作用是,在插件激活和钝化等活动中进行专门处理以分配和释放资源.像上述的JUnit插件例子,插件设计者没有对该插件特别指定激活和钝化处理,也没有指定插件类.在这种情况下,Eclipse运行组件将为该插件自动提供一个缺省的插件实例.
当插件需要进行激活和钝化的时候,插件设计者子类化org.eclipse.core.runtime.Plugin类,并覆盖该类的激活和钝化方法,它们是
startup和
shutdown方法,同时在相应的插件清单文件(plugin.xml)中,添加该插件子类的全限定名到相应的属性值中.
Eclipse 包含一个被称为Eclipse平台或Eclipse运行以及某些核心插件的插件管理内核.这些核心插件的标识被注册到Eclipse平台中,这样平台就知道在每一个Eclipse的运行实例中激活这些插件.另外,对于哪些非核心插件,当他们在被其他插件需要时被激活.
在Eclipse模型中,插件之间可能存在如下关系:
·
依赖. 处于这种关系中的是依赖插件和必要条件插件.必要条件插件支持依赖插件的功能.
·
扩展 处于这种关系中的是宿主插件和继承者插件.继承者插件继承宿主插件的功能.
这些关系被声明在插件清单XML文件的requires和extension属性中(细节将在下面的部分中讨论).
对于一个已经被部署到Eclipse中的非核心插件,如果它通过依赖和扩展关系的组合来主动关联到核心插件中,就可以被一个Eclipse运行实例激活.当这个插件的功能被要求支持或扩展另一个插件的功能时,它就被激活了.对于一个任何核心插件通过依赖和扩展关系都不可到达的已部署插件,从插件激活的角度来看,它是没有被部署的.当然,如果没有用户动作或其它触发事件的情况下,即使对于一个可到达的插件,在Eclipse运行实例的一段或整个生命周期中,都会保持非激活状态.
2.2. 依赖关系
当一个插件依赖于其它插件的功能的时候,依赖关系就会通过清单文件中的requires元素来指定.如下例:
id="com.bolour.sample.eclipse.demo" name="Extension Processing Demo" version="1.0.0">
Listing 2.2. Specifying Plug-in Dependencies.
|
在这个例子中,com.bolour.sample.eclipse.demo类被声明成依赖于(或使用) org.eclipse.ui类.
被定义在清单文件中的依赖关系是一个运行和编译时指令.在运行时,Eclipse必须在依赖插件被激活的时候确认必要条件插件对依赖插件可用.在编译时,Eclipse可以把编译依赖插件所需要的所有必要的插件的jar文件扩充到类路径中.
(未完待续)