随笔 - 3, 文章 - 152, 评论 - 17, 引用 - 0
数据加载中……

5.2 插件的Hello World

*******************************************************
作者:陈刚,普通程序员,曾有幸以Eclipse插件方式开发过一个中型软件。现将所学
付诸于纸,暂取书名<Eclipse插件开发指南>,将于2005年初由清华大学出版社出版。
blog:http://www.cnblogs.com/glchengang/
*******************************************************
 
 

 

5.1.1  Eclipse插件开发简介

插件的概念读者应该很熟悉,象MP3播放软件WINAMP的皮肤插件、Windows Media Player的众多的外观插件、音效插件等等。但如果你以为插件只能做成为原软件的边角料,那是可以理解的,因为你还没有看到过Eclipse的插件是什么样的。Eclipse可以全面更新你对插件的概念,它也是对插件概念运用得最彻底最炉火纯青的一个软件。

在第一章我们就介绍了Eclipse的技术特点,Eclipse的内核很小,其他功能都是基于这个内核上的插件,如Eclipse自带的UNITANT等。而且Eclipse还开放了自己的插件机制,并提供了很好的插件开发环境,让用户可以自己来开发Eclipse的插件。想知道开发Eclipse的插件能到什么程度吗?看看这些Eclipse上的插件吧:用于UML建模的Together for Eclipse、用于JSPMyEclipseLombozIBM的全能开发工具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.javaSampleAction.javaMypluginPlugin.java较重要,今后将会使用到它,而SampleAction.java则是一个类似JFace中的Action,可以把它看做是插件中的Action,等会运行时我们将看到SampleAction.java的效果。

项目根目录下还有一个非常重要文件的plugin.xml,这个文件是插件的入口文件,Eclipse是根据这个文件里的设置信息来加载插件的。在插件加发初期会频繁在这个文件中做编辑,术语叫“设置扩展点”。象在Eclipse的增加主菜单、视图、按钮等,都是在这个文件里面设置不同的扩展点,后面的将详细讲到如何编辑此文件。有人会问:开发一个系统会有很多的菜单和按钮,是不是都要在这个文件里设置呢?回答:不必。在plugin.xml里只设置和Eclipse接壤的主要扩展点,其他软件自有的菜单和按钮不用在plugin.xml设置了。图5.4Eclipse界面中部显示的就是plugin.xml的设置窗口,单击该窗口下部的plugin.xml项后(如图5.5所示),就可以直接编辑此文件。

5.5  plugin.xml编辑窗下部的选项条

3、运行插件

如图5.6所示,选择主菜单“运行→运行方式→运行工作平台”,这种是专用是插件的运行方式,它将打开一个新的Eclipse环境,并同时将插件项目编译加载到新的Eclipse环境中。今后开发经常要通过这个方法来试运行所开发的插件项目,不过那时候选择“运行→调试方式→运行工作平台”以调试方式来运行插件会比较多,Eclipse支持调试期间的热修改,不用每次修改都新启一个Eclipse,这样能节省很多调试开发时间。

 新开的Eclipse界面如图5.6所示,在新的Eclipse环境中新增加了一个工具栏按钮和一个主菜单项。单击此按钮或菜单项,将弹出一个“HelloEclipse 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,比如eclipsetomcat插件是这样命名的: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设置,它要用到draw2dgef插件来画图、用于插件的帮助系统来创建建自己的帮助文档。

<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="样本菜单(&amp;M)"

               id="sampleMenu">

            <separator

                  name="sampleGroup">

            </separator>

         </menu>

         <action

               label="样本操作(&amp;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插件运行效果图

posted on 2005-02-15 11:12 阅读(219) 评论(0)  编辑  收藏 所属分类: Edit Tools


只有注册用户登录后才能发表评论。


网站导航: