插件开发入门 (十五)

来源:互联网 发布:windows ntp服务器搭建 编辑:程序博客网 时间:2024/05/05 06:16

Eclipse最有魅力的地方就是它的插件体系结构。在这个体系中重要的概念是扩展点(extension points)。扩展点就是在软件开发过程中暴露出来的接口。每一个插件都是在现有的扩展点上开发的,并可能还留有自己的扩展点,以便在这个插件上继续开发。

简介


Eclipse 平台是IBM向开发源码社区捐赠的开发框架,它之所以出名并不是因为IBM宣称投入开发的资金总数为4 000万美元,而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的、可扩展的体系结构。Eclipse 的价值是它为创建可扩展的集成开发环境提供了一个开放源码平台。这个平台允许任何人构建与环境和其他工具无缝集成的工具。工具与Eclipse无缝集成的关键是插件。除了小型的运行时内核之外,Eclipse中的所有东西都是插件。从这个角度来讲,所有功能部件都是以同等的方式创建的。

由于有了插件,Eclipse系统的核心部分在启动时要完成的工作十分简单:启动平台的基础部分和查找系统的插件。整个Eclipse体系结构就像一个大拼图,可以不断地向上加插件,同时,在现有插件上还可以再加插件。

开发“Hello,world”插件


创建插件最简单的方法是使用Eclipse中专门为开发插件而设计的插件PDE(Plug-in Development Environment)。PDE 和 Java Development Tooling(JDT)IDE是 Eclipse 的标准扩展。PDE 提供了一些向导可以帮助创建插件。下面的“Hello,world”插件将通过PDE进行开发。

下面是创建一个简单插件的操作步骤。

(1)运行Eclipse。

单击Eclipse的“File”→“New”→“Other”菜单项,在弹出的对话框中选择Select对话框左边的Plug-in Development向导。如图1所示,选择Plug-in Project。


图1 新建插件对话框

(2)单击“Next”按钮,弹出新建对话框,输入项目名称。此处使用了“com.test.helloworld”。单击“Next”按钮后弹出新建对话框页,如图2所示,插件标识就与项目名称相同。使用项目名称作为插件标识可以将该插件与另一个插件的名称发生冲突的机会减到最小。


图2 新建对话框向导

(3)单击“Next”按钮,选择“Hello, world”,如图3所示。


图3 新建插件向导

(4)单击“Finish”按钮,就可以创建用户想要建立的插件。

上例中通过插件创建向导创建了“Hello,world插件”,通过Eclipse的插件创建向导还能够创建其它扩展点插件的创建。

调试“Hello,world”插件


通过PDE不但能创建插件,还能够调试插件。在Eclipse中调试插件的步骤如下。

(1)单击“Run”→“Debug”菜单项。

(2)在弹出的对话框窗口中用鼠标右键单击“Eclipse Application”选项。

(3)单击“New”菜单项(或双击Eclipse Application树节点),创建调试插件配置参数对话框,并通过对话框设置插件的调试参数,如图4所示。


图4 Debug环境参数设置

(4)单击“Debug”按钮。

现在已经启动了一个调试的Eclipse,可以看到图5显示的调试窗口。调试窗口多了一个“Sample Menu”菜单项,工具栏多了一个按钮,单击菜单或按钮将会弹出 “Hello,world”对话框。


图5 “Hello,world”插件效果图

用户可以在程序中可执行到的位置设置断点,就可以和调试Java程序一样调试Eclipse插件了。

注意:如果在图4中选择Clear workspace data before lauching,表示每次调试插件时是否提示清空运行时刻的Workspace。可以选择“是”,表示重建运行时刻的Workspace。

插件打包


这一步是把用户开发的插件打包,供别人使用。具体步骤如下。

(1)选择“Hello,world”插件,单击鼠标右键,选择“Export”菜单,弹出图6所示的对话框。


图6 插件打包对话框

(2)输入用户想要打包的文件名。如果想把源文件也打包,可以选择“Include source code”复选框。现在“Hello,world”插件就已经成功打包了。

(3)把“Hello,world”插件解压缩拷贝到用户的Eclipse的Plugins目录下面。运行Eclipse,就可以在运行环境下看到“Hello,world”插件的身影了。

通过Export 菜单对插件进行打包,实际上Eclipse会读取插件目录下的build.properties文件,通过它来描述需要打包的内容。

提示:不要把“Hello,World”插件拷贝到开发环境的Eclipse下面,否则插件可能不会被注册。因为开发环境的Workspace中有相同ID的插件,这样会产生冲突。要养成好习惯,把开发环境和部署环境分开。

插件描述文件


Eclipse中插件的描术文件包括Plugin.xml文件和MANIFEST.MF:

l Plugin.xml:Plugin.xml描述了扩展点的基本信息,包括扩展点的实现和定义,它按照扩展点的定义文件(schema)描述扩展的信息。

l MANIFEST.MF:MANIFEST.MF记录了插件的状态信息,包括插件的依赖关系、运行时的类加载路径以及插件的名称等。

Plugin.xml主要是通过XML文件格式描述扩展点的具体内容。当Eclipse启动后,它将会找到所有插件的描述文件。当Eclipse第一次启动某一个插件时,它会从MANIFEST.MF文件读取插件的相关信息,并通过定义的插件类初始化插件。

插件描述文件编辑器窗口,如图7所示。


图7 清单文件编辑窗口

Manifest.MF文件中保存了插件的基本信息(和OSGI相关的信息),而Plugin.xml文件记录了扩展点的信息,这两个文件在一个编辑器中展现,分成如下几个部分。

l Overview:描述了插件的基本信息。

l Dependencies:描述了插件的依赖关系。

l Runtime:指明运行时的ClassPath。

l Extensions:指明插件实现的扩展点。

l Extension Points:指明插件提供的扩展点。

1. OverView:描述了插件的基本信息

OverView描述了插件的基本信息,如图8所示。


图8 OverView页面

l ID:ID是插件的ID号,在Eclipse中是一个具体标识。

l Version:Version指明用户所开发的插件的版本号。

l Name:指用户所开发的插件的名称。

l Provider:开发者。

l Class:Class是指插件类,它由Eclipse建立并初始化,后面的章节将会详细介绍。

l Platform. Filter:指定平台相关的一些信息,一般来说用户不需要设定。

提示:ID号在Eclipse中是一个全局的标识。很多初学者常常会对不同的插件命名成相同的ID号,这样会导致插件不能加载。

2. Dependencies:描述了插件的依赖关系

Dependencies页面描述了插件的依赖关系,如图9所示,插件依赖org.eclipse.ui和org.eclipse.core.runtime插件。


图9 Dependencies页面

Dependencies是一个比较重要的概念。每一个插件有独立的ClassPath,Dependencies会把依赖的插件的ClassPath加入到当前的ClassPath中。

提示:插件可以调用依赖的插件中所有导出的类,但插件不能够有循环依赖,所以在设计插件的结构时一定要设计合理,切记、切记。

3. Runtime:指明了运行时的ClassPath

Runtime:指明了运行时的ClassPath。如图10所示,jdom.jar为此插件运行时依赖的包。


图10 Runtime页面

在Exported packages中也加入了一些要导出的包,如果不导出这些包,其它依赖当前插件的插件就用不了当前插件中对应包下的类。

Runtime也是一个比较重要的概念,它指明了运行时的环境。Eclipse中插件不会引用到系统的ClassPath,每一个插件都有独立的ClassPath。

提示:很多人在开发插件时,没有通过Runtime指明ClassPath,而是直接添加Jar包,这样,在编译期间可能不会出错,但是在插件运行时会提示类找不到(ClassNotFoundException),就是这个问题。

4. Extensions:指明插件实现的扩展点

Extensions:指明插件实现的扩展点。例如插件要实现“org.eclipse.ui.actionSets”扩展点,如图11所示。


图11 Extensions页面

Extensions是用户在开发一个插件中用到的扩展点,也是Eclipse开发的精髓所在。后面章节的主要工作就是围绕扩展点展开的。下面为扩展点在Plugin.xml文件中定义的片段。



<extension

point="org.eclipse.ui.actionSets">

<actionset

label="Sample Action Set"

visible="true"

id="com.test.helloworld.actionSet">

<menu

label="Sample &Menu"

id="sampleMenu">

<separator

name="sampleGroup">





<action

label="&Sample Action"

icon="icons/sample.gif"



class="com.test.helloworld.actions.SampleAction"

tooltip="Hello, Eclipse world"

menubarPath="sampleMenu/sampleGroup"

toolbarPath="sampleGroup"

id="com.test.helloworld.actions.SampleAction">







5. Extension Points:指明了用户插件提供的扩展点

Extension Points:指明了用户插件提供的扩展点。如图12所示,此处为UI插件所提供的扩展点。


图12 插件提供扩展点

Eclipse的强大功能就是提供插件的扩展机制,用户可以实现他人提供的扩展点,也可以通过“Extension Points”为他人提供扩展点。

提示:实现扩展点和提供的扩展点是两个不同的概念。实现扩展点是利用其他插件提供的扩展点,实现用户想要完成的功能。提供的扩展点是为其他插件提供扩展所需要的接口。

0 0
原创粉丝点击