*******************************************************
作者:陈刚,普通程序员,曾有幸以Eclipse插件方式开发过一个中型软件。现将所学
付诸于纸,暂取书名<Eclipse插件开发指南>,将于2005年初由清华大学出版社出版。
blog:http://www.cnblogs.com/glchengang/
*******************************************************
5.1.1 Eclipse插件开发简介
插件的概念读者应该很熟悉,象MP3播放软件WINAMP的皮肤插件、Windows Media Player的众多的外观插件、音效插件等等。但如果你以为插件只能做成为原软件的边角料,那是可以理解的,因为你还没有看到过Eclipse的插件是什么样的。Eclipse可以全面更新你对插件的概念,它也是对插件概念运用得最彻底最炉火纯青的一个软件。
在第一章我们就介绍了Eclipse的技术特点,Eclipse的内核很小,其他功能都是基于这个内核上的插件,如Eclipse自带的UNIT、ANT等。而且Eclipse还开放了自己的插件机制,并提供了很好的插件开发环境,让用户可以自己来开发Eclipse的插件。想知道开发Eclipse的插件能到什么程度吗?看看这些Eclipse上的插件吧:用于UML建模的Together for Eclipse、用于JSP的MyEclipse和Lomboz、IBM的全能开发工具WSAD等等,它们全是Eclipse的插件。如果微软愿意,也可以把Office软件做成Eclipse的插件。如果Adobe有兴趣,Photoshop也可以有for Eclipse的插件版,Eclipse中的API Draw2D的绘图功能也是很功的。
Eclipse的各式插件正如雨后春笋般不断冒出,Eclipse已经超越了开发环境的概念,它的目标是做成一个通用的平台,让尽量多的软件做为插件集成在上面,成为未来的集成的桌面环境。同样我们可以将我们的应用系统写成Eclipse插件,笔者就在2004年参与开发了一个项目管理软件,该软件就是以Eclipse的插件形式开发的。
5.1.2 Eclipse插件开发的优势和不足
那么将软件写成插件有什么好处呢?对于用户来说Eclipse的使用环境比较友好,前面介绍的SWT/JFace中还是比较基本的界面元素,象Eclipse中的视图、编辑窗、停泊窗这些界面如果实现呢?如果用Appliction的方式会很麻烦,如果写成Eclipse插件则实现这些界面风格不会吹灰之力。可以说把软件开发成Eclipse插件的最大好处就是界面风格友好统一,如果用户较熟悉Eclipse超做的话这种优势就更明显。
当然将软件写成插件形式也有一定的缺陷。首先插件必须依附Eclipse,如果要安装插件就得先安装Eclipse。其次,插件和Eclipse融合在一起,原Eclipse的一些菜单和工具栏是无法完全屏蔽的。
5.2 插件的Hello World
5.2.1 使用向导一步步创建HelloWorld
我们利用Eclipse的“新建”向导来创建一个简单的插件。
1、新建一个插件项目
(1)选择主菜单“文件→新建→项目”,在弹出的窗口中(如图5.1所示)选择“插件开发”下的“插件项目”,然后单击“下一步”。
图5.1 项目类型选择
(2)如图5.2所示,输入项目名“myplugin”,其他设置不变,然后单击“下一步”。
图5.2 项目名称
(3)在新显示的窗口中接受所有缺省值不变,直接单击“下一步”,这时将显示模板选择窗口(如图5.3所示)。勾选“使用其中一个模板来创建插件”项,然后选择模板“Hello,World”项。最后单击“完成”结束向导对话框。
图5.3 模板选择窗口
2、插件项目myplugin简介
如果在新建项目中操作正确,Eclipse将显示如图5.4所示界面。
图5.4 建立一个插件项目后的Eclipse界面
界面的左边视图中多了一个名为“myplugin”的项目。项目中有两个文件:MypluginPlugin.java、SampleAction.java。MypluginPlugin.java较重要,今后将会使用到它,而SampleAction.java则是一个类似JFace中的Action,可以把它看做是插件中的Action,等会运行时我们将看到SampleAction.java的效果。
项目根目录下还有一个非常重要文件的plugin.xml,这个文件是插件的入口文件,Eclipse是根据这个文件里的设置信息来加载插件的。在插件加发初期会频繁在这个文件中做编辑,术语叫“设置扩展点”。象在Eclipse的增加主菜单、视图、按钮等,都是在这个文件里面设置不同的扩展点,后面的将详细讲到如何编辑此文件。有人会问:开发一个系统会有很多的菜单和按钮,是不是都要在这个文件里设置呢?回答:不必。在plugin.xml里只设置和Eclipse接壤的主要扩展点,其他软件自有的菜单和按钮不用在plugin.xml设置了。图5.4的Eclipse界面中部显示的就是plugin.xml的设置窗口,单击该窗口下部的plugin.xml项后(如图5.5所示),就可以直接编辑此文件。
图5.5 plugin.xml编辑窗下部的选项条
3、运行插件
如图5.6所示,选择主菜单“运行→运行方式→运行工作平台”,这种是专用是插件的运行方式,它将打开一个新的Eclipse环境,并同时将插件项目编译加载到新的Eclipse环境中。今后开发经常要通过这个方法来试运行所开发的插件项目,不过那时候选择“运行→调试方式→运行工作平台”以调试方式来运行插件会比较多,Eclipse支持调试期间的热修改,不用每次修改都新启一个Eclipse,这样能节省很多调试开发时间。
新开的Eclipse界面如图5.6所示,在新的Eclipse环境中新增加了一个工具栏按钮和一个主菜单项。单击此按钮或菜单项,将弹出一个“Hello,Eclipse world”信息提示框。
图5.6 myplugin插件运行效果图
4、总结
本节里我们还只是依样画葫芦,感觉有点云里雾里的吧。但不管怎么样,第一个Eclipse插件已经在我们手里诞生了,下一节我们将不用HelloWorld模板来新建一个空白的插件项目,然后一步步的经过手工实现这个Hello World插件项目所拥有的功能。
5.2.2 以空白项目为基础手工创建HelloWorld
1、新建项目
按照上一节所讲新建插件项目的方法,新建一个名为myplugin2的插件项目。注意在最后一步不要选择任何模板,直接单击“完成”结束向导对话框,除此之外的其他步骤都一样。很幸运,Eclipse3.0修正了很多BUG,象以前用Eclipse2.X中文版时,在这一步还会出很多库引用的错误,要很麻烦的一个个去修正。
2、创建IWorkbenchWindowActionDelegate接口的实现类
新建一个包book.chapter_5,并将上一节中由HelloWorld模板生成的myplugin项目中的SampleAction.java文件复制到本项目中(Eclipse支持鼠标拖拉操做)。然后对SampleAction做了一些小修改:删除了无用的注释和构造函数,修改了一下弹出框的提示文字,修改后的代码如下:
/**
* 本类相当于插件的Action,要在Eclipse中增加主菜单或工具栏按钮,
* 就需要写一个实现IWorkbenchWindowActionDelegate接口的类
*/
public class SampleAction implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow window;
public void run(IAction action) {
//打开一个信息提示框
MessageDialog.openInformation(window.getShell(),
"Myplugin2插件", "Hello,这是手工做的插件");
}
public void selectionChanged(IAction action, ISelection selection) {}
public void dispose() {}
public void init(IWorkbenchWindow window) {this.window = window;}
}
3、原plugin.xml文件各设置项说明
如图5.7所示,将plugin.xml文件打开,并单击窗口下的“plugin.xml”项转到其代码编辑窗。
图5.7 plugin.xml的代码编辑窗
项详细介绍其中的各项设置如下:
(1)<plugin>项
<plugin
id="myplugin2"
name="Myplugin2 插件"
version="1.0.0"
provider-name=""
class="myplugin2.Myplugin2Plugin">
说明:<plugin>是plugin.xml的主体。
l id - 插件的唯一标识。实际项目中一般加上包名或网址名来命名id,比如eclipse的tomcat插件是这样命名的:org.eclipse.tomcat,这样在世界上就不会有插件的标识名和你重名了。以后在某些扩展点中的属性也会用到标识符作为名称的前缀。
l name - 插件的名称,可以不唯一。
l version - 插件版本号。
l provider-name - 插件开发商的名称,可以写上作者或公司的名称。
l class - 插件类的名称,即插件项目自动生成的MypluginPlugin2.java文件的类,前面加上包名。
(2)< runtime>项
<runtime>
<library name="myplugin2.jar">
<export name="*"/>
</library>
</runtime>
说明:这里是声明插件运行时需要的jar包,比如插件要连接MySQL数据库需要它的一个包,如下定义,其中“lib\”是该包所在路径。其中本插件自身的jar包也要声明,而且本插件在打包时将以myplugin2.jar为名打包。
<runtime>
<library name="myplugin2.jar">
<export name="*"/>
</library>
<library name="lib\mysql-connector-java-3.0.9-stable-bin.jar"/>
</runtime>
(3)<requires>项
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
</requires>
说明:在requires域中定义了该插件所要使用的依赖插件。现在两项就够了,随着开发的不断深入这里将会添加更多对其它插件的引用。如下是笔者的实际项目中的requires设置,它要用到draw2d和gef插件来画图、用于插件的帮助系统来创建建自己的帮助文档。
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.draw2d"/>
<import plugin="org.eclipse.gef"/>
<import plugin="org.eclipse.help"/>
<import plugin="org.eclipse.help.ui"/>
<import plugin="org.eclipse.help.appserver"/>
<import plugin="org.eclipse.help.webapp"/>
</requires>
4、为HelloWorld修改plugin.xml
将如下代码加入到plugin.xml的“</requires>”行之后:
<extension point="org.eclipse.ui.actionSets">
<actionSet
label="样本操作集"
visible="true"
id="myplugin2.actionSet">
<menu
label="样本菜单(&M)"
id="sampleMenu">
<separator
name="sampleGroup">
</separator>
</menu>
<action
label="样本操作(&S)"
icon="icons/sample.gif"
class="book.chapter_5.SampleAction"
tooltip="Hello,这是手工做的插件"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
id="book.chapter_5.SampleAction">
</action>
</actionSet>
</extension>
说明:
在<extension>项设置要扩展的扩展点,它是非常重要的一项。
l point="org.eclipse.ui.actionSets",设置了本插件的扩展点为何,actionSets是指Eclipse的菜单、菜单项和工具栏按钮的扩展点
l <actionSet>项表示一个action组(菜单、按钮)。label是显示的名称。id其唯一标识符,只要保证在本plugin.xml文件中不存在重复的id就行了。visible指设置的按钮或菜单是否显示,如果设置成false,则不显示。注意:要看visible设置的效果要将“透视图”关掉再重新打开。
l <menu>是<actionSet>下的子项,它表示在Eclipse中插入显示一个名为“样本菜单(M)”的主菜单。separator标签是一个结束符,它可以对菜单分组。
l <action>也是<actionSet>下的子项,由它设置菜单、按钮。icon是图片的路径,如果该图片不存,默认是一个红色实心小框(Eclipse2.X)或不显示图片而显示文字(Eclipse3.X)。Class是按钮所对应的类,注意包名也要加上。menubarPath表示把这个action做成一个菜单项放在上前<menu>定义的主菜单下。toolbarPath表示把这个action再做成一个工具栏按钮。id是标识符,设置成和class项一样的名称是个不错的选择。
以上仅是Eclipse的扩展点中的一种,此外还有其它的扩展点共有一百多种之多。我们没有必要了解所有扩展点的设置,只须熟悉一些常用的扩展点即可,如视图的扩展点org.eclipse.ui.views、编辑器的扩展点org.eclipse.ui.editors等,本书将陆续给于介绍。另外,各种扩展点在Eclipse的帮助中有详细的说明,其位置为:选择主菜单“帮助→帮助内容”,然后打开“平台插件开发指南→参考→扩展点参考”项。
5、运行插件
按上一节(5.2.1节)所说的方法运行插件(运行之前不妨将上节所建的myplugin项目关闭掉,关闭方法:右键单击myplugin项目名,然后在弹出菜单中选择“关闭项目”)。myplugin2插件的效果如图5.8所示
图5.8 myplugin2插件运行效果图