动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.项目开发规范(Java).
.Java动态代理实现AOP.
.java指南之使用图形:使用图像.
.Hibernate配置文件在单元测试中的.
.对Java程序多态性支持的改进.
.Web框架tomcat5.0的目录结构.
.基于范型的java函数式编程(一).
.Velocity -- Java Web 开发新技术.
.Java学习之开始使用神奇的i=i++.
.Java:Web应用下实现定时任务的简.
.XMLHTTP---介绍.
.2005 Java中国开发者大会现场报道.
.选择与编组.
.propertiesedit.plugin_3.6.8_fo.
.新版JDeveloper 9.0.3.
.用JavaBean数据组件集成JSF应用程.
.WebWork 2.1.1发布.
.论Java加密技术与Windows的结合.
.EJB的编程规则之Session Bean.
.成功规划SOA:进行长期SOA规划.

开发Eclipse插件

发表日期:2008-1-5 |


Eclipse最有魅力的地方就是它的插件体系结构。在这个体系中重要的概念是扩展点(extension points),也就是为插件提供的接口。每一个插件都是在现有的扩展点上开发,并可能还留有自己的扩展点,以便在这个插件上继续开发。
由于有了插件,Eclipse系统的核心部分在启动的时候要完成的工作十分简单:启动平台的基础部分和查找系统的插件。在Eclipse中实现的绝大部分功能是由相应的插件完成的,比如WrokBench UI插件完成界面的外观显示,Resource Management插件完成维护或生成项目或文件等资源治理工作(在下面的第二个例子就会用到这个插件),而Version and Configuration Management (VCM)插件则负责完成版本控制功能,等等。虽然以上提到的每一个功能都是绝大多数IDE环境所必备的功能,Eclipse却也把它们都做成了插件模式,甚至用来开发Java程序的开发环境(Java development tooling,JDT)也只不过是Eclipse系统中的一个普通插件而已。整个Eclipse体系结构就象一个大拼图,可以不断的向上加插件,同时,现有插件上还可以再加插件。下面的插件开发示例就是在WorkBench UI插件中的观察窗口扩展点上开发的。

本文第一部分介绍过Eclipse的开发界面其中之一就是观察窗口,它通常配合编辑窗口显示一些有用的信息,在这里我们只简单生成一个显示欢迎信息的观察窗口,假设新插件的名子叫Welcome。

第一步,先用向导新建一个Java项目。我们可以在菜单栏选择FileàNew,或用工具栏的向导按键,或是在资源窗口用鼠标右键菜单中的New,打开向导对话框,然后用缺省方式创建项目。并在项目中建立一个Welcome.java文件,代码如下:

package com.nidapeng.eclipse.plugin;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;
import org.eclipse.ui.part.ViewPart;
public class Welcome extends ViewPart {
 Label label;
 public Welcome() {
 }
 public void createPartControl(Composite parent) {
  label = new Label(parent, SWT.WRAP);
  label.setText("Welcome to Eclipse");
 }
 public void setFocus() {
 }
}


为使这个程序能正常编译,要配置它的编译环境,即指定所需的CLASSPATH。在Eclipse中可以用几种方法,常用的是两种:第一是在资源窗口或Java包窗口选中该项目,点击鼠标右键,在打开的菜单中选择属性(Properties),之后在属性对话框中选择Java Build PathàLibraries,用Add External JARs功能添加三个包,它们都是Eclipse的现有插件的类包,可以在"你的Eclipse安装路径\plugins"下面的相应路径中找到。分别是org.eclipse.core.runtime插件中的runtime.jar,org.eclipse.swt中的swt.jar和org.eclipse.ui中的workbench.jar。第二种指定CLASSPATH的方法是先将以上提到的三个包直接导入到Eclipse中的某下一个项目中。假如导入到和Welcome.java相同的项目中,则无需进一步指定CLASSPATH,否则需要在项目的属性菜单中选择Java Build PathàProjects,然后选中这三个包所在的项目。

在我们的项目中还要生成一个XML文件,它的名字必须plugin.xml。代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<plugin
   id="com.nidapeng.eclipse.plugin"
   name="Welcome to Eclipse"
   version="1.0"
   provider-name="Ni Dapeng">
<requires>
   <import plugin="org.eclipse.ui"/>
</requires>
<runtime>
   <library name="welcome.jar"/>
</runtime>
<extension
      point="org.eclipse.ui.views">
   <category
         name="Welcome"
         id="com.nidapeng.eclipse.plugin.category1">
  </category>
   <view
         name="Welcome to Eclipse"
         category="com.nidapeng.eclipse.plugin.category1"
         class="com.nidapeng.eclipse.plugin.Welcome"
         id="com.nidapeng.eclipse.plugin.view1">
  </view>
</extension>
</plugin>


在plugin.xml中一共有四个主要的标签:plugin,requires,runtime,extension。其中plugin标签的属性提供的是我们要开发的Welcome插件的基本信息,除了name,version,provider-name等,最重要的是id,它要求不能和现有的Eclipse插件id有冲突,因此我们用包名作为插件的id。requires标签中所列出的是需要的插件,这里我们要用到Eclipse Workbench和SWT API,因此导入了org.eclipse.ui插件。runtime标签指明的是我们开发的插件所在JAR包的文件名。extension标签是插件扩展点的信息。org.eclipse.ui.views是Eclipse系统提供的观察窗口扩展点,我们的例子是一个观察窗口(View),这表明我们是要在 org.eclipse.ui.views扩展点上进一步开发。extension中还包括category和view两个标签,在后续的启动Welcome插件步骤中,我们就会知道这两个标签的含义。要注重的是category和view标签的id的唯一性,并且在view的属性中声明了Welcome插件的类名。

在Eclipse中为plugin.xml提供了缺省可视化的编辑器,在编写plugin.xml过程中可以借助这个编辑器完成一些工作。假如你直接录入了plugin.xml文件源代码,还可以用这个编辑器校验你的代码:假如编辑器不能正确读入,就表明你的plugin.xml有一些问题。

在确认Weclome.java和plugin.xml都正确无误之后,可以用Eclipse菜单栏中的EXPort命令将Weclome.java导出为JAR文件,它的名子应该和plugin.xml中runtime声明的JAR相一致。同时导出plugin.xml。安装Welcome插件的方法和本文第一部分介绍的安装Tomcat插件方法是一样的:首先在"Eclipse的安装路径\plugins"路径下面建立一个com.nidapeng.eclipse.plugin路径,然后将Weclome.jar和plugin.xml拷到这个路径下。之后必需重新启动Eclipse,在Eclipse启动的时候,它会搜索所有在插件路径下的插件并注册它们(仅仅是注册,只有在需要某个插件的时候,Eclipse才会启动它)。在重新启动的Eclipse的菜单栏中选择PerspectiveàShow ViewàOthers,在打开的对话框中我们会找到在plugin.xml中extension的category标签中声明的name属性:Welcome。在Welcome的支结点中包含了view标签name属性:Welcome to Eclipse。选中它并确认,Welcome窗口就会显示在Eclipse Workbench上的某个位置 。假如在执行了以上操作,但没有显示新窗口,可以再次打开Show View菜单,此时在菜单中应该有新一顶选择:Welcome to Eclipse,然后选中它。

上面我们完成了一个观察窗口的插件,但这个操作过程对开发稍微复杂一些的插件就显得不太方便了:每次测试都要将代码打包,发布,再重新启动Eclipse系统!为此Eclipse提供了一个专门为开发插件而做插件(有点绕嘴):Plug-in Development Environment(PDE)。本文前面曾提到,目前Eclipse的Release或Stable版本缺省提供了这个插件,因此假如安装的Eclipse是这两个版本中的一个就可以直接进行下面的步骤。下面我们再用PDE环境开发一个稍微复杂一些的插件。

第一步仍然要新建一个项目,只是在向导中不是用Java项目,而是Plug-in Development中的Plug-in Project。在应用向导生成新项目的时候,要注重两点:第一是PDE的项目名称就是plugin的id,因此要保证它的唯一性,这里我们的项目名是com.nidapeng.eclipse.plugin.pde。其次为了进一步说明Eclipse插件的结构,在Plug-in Code Generators中,选择用向导模板生成一个缺省的插件,如图六:



图六


这个用缺省方式生成的插件类对于我们将要的代码并不是必需的,也可以用生成空插件的方式建立我们的项目,这样做只是为进一步说明Eclipse的插件结构。

项目生成之后,在我们的项目中会包含一个PdePlugin.java文件,它就是以缺省方式生成的插件类。注重到它继续了AbstractUIPlugin类,而AbstractUIPlugin类实现了org.eclipse.ui.plugin接口。事实上,所有的Eclipse插件都会有一个相应的实现plugin接口的类,这个类将是新插件的主类(类似于有main()函数的Java类),它负责治理插件的生存期。在我们的AbstractUIPlugin继续子类中,可以用singleton模式来保存在Eclipse中的生成的该插件的第一个也是唯一实例,一般来说,在该继续子类中也要实现一个getDefault()方法以返回当前插件的实例。而且,当Eclipse首次使用该插件的时候,这个主类将是第一个被调用的类,因此我们也可以在它的代码中执行一些初始化的工作。而且假如插件需要使用Preferences,Dialogs或Images资源,也可以通过这个类中的相应方法来得到它们的实例,如用其中的getDialogSettings(),getPreferenceStore(),getImageRegistry()方法。

但是象前面提到的,PdePlugin.java对下面的例子并不是必需的,我们不用对它进行任何修改。在我们第一个例子中的Weclome插件,根本就没有生成AbstractUIPlugin的继续子类,此时系统会自动为Weclome插件生成一个缺省的主类(类似于Java类构造函数,假如没有声明,系统会指定一个默认的构造函数)。

下面的代码是才真正实现了我们新插件的功能,假设这个插件名子是NoticeView:

package com.nidapeng.eclipse.plugin.pde;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.runtime.CoreException;
import java.util.ResourceBundle;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
public class NoticeView extends ViewPart implements 
Runnable,IResourceChangeListener ,IResourceDeltaVisitor{
 private ResourceBundle resourceBundle;
 private Label label;
 private Display disp; 
 private String dispTxt;
 public NoticeView() {
    ResourcesPlugin.getWorkspace().addResourceChangeListener(this,
      IResourceChangeEvent.PRE_CLOSE
       IResourceChangeEvent.PRE_DELETE
       IResourceChangeEvent.PRE_AUTO_BUILD
       IResourceChangeEvent.POST_AUTO_BUILD
       IResourceChangeEvent.POST_CHANGE);
 }
 public static IWorkspace getWorkspace() {
  //ResourcesPlugin插件的主类!
   return ResourcesPlugin.getWorkspace();
  }
 public void createPartControl(Composite parent) {
     label = new Label(parent, SWT.WRAP);
  label.setText("change your project status...");
         disp = Display.getDefault();
  }
 public void setFocus() {
  }
 // 实现IResourceChangeListener接口中的resourceChanged方法
 public void resourceChanged(IResourceChangeEvent event) {
    IResource res = event.getResource();
    switch (event.getType()) {
      case IResourceChangeEvent.PRE_CLOSE :
        dispTxt = res.getFullPath() + " is about to closed!";
        break;
      case IResourceChangeEvent.PRE_DELETE :
        dispTxt = res.getFullPath() + " is about to be deleted!";
       break;
      case IResourceChangeEvent.POST_CHANGE :
        try {
         event.getDelta().accept(this);
        } catch (CoreException e) {
          e.printStackTrace();
        }
        break;
      case IResourceChangeEvent.PRE_AUTO_BUILD :
        try {
         event.getDelta().accept(this);
        } catch (CoreException e) { 
         e.printStackTrace();
        }
        break;
      case IResourceChangeEvent.POST_AUTO_BUILD :
        try {
         event.getDelta().accept(this);
        } catch (CoreException e) {
          e.printStackTrace();
        }
        break;
    }
    disp.syncExec(this);
  }
  // 实现IResourceDeltaVisitor接口中的visit方法
  public boolean visit(IResourceDelta delta) {
    IResource res = delta.getResource();
    switch (delta.getKind()) {
     case IResourceDelta.ADDED :
       dispTxt = "Resource "+res.getFullPath()+" was added.";
       break;
     case IResourceDelta.REMOVED:
       dispTxt = "Resource "+res.getFullPath()+" was removed.";
      break;
     case IResourceDelta.CHANGED :
       dispTxt = "Resource "+res.getFullPath()+" has changed.";
      break;
    }
    return true; // visit the children
  }
 // 实现Runnable接口中的run方法
  public void run() {
    try {
      label.setText(dispTxt); 
    } catch (Exception e) {
      e.printStackTrace();
    }
 }
}


象上面的第一个Welcome插件,这个新插件同样继续了ViewPart,不同的是实现了三个接口:Runnable,IResourceChangeListener ,IResourceDeltaVisitor。其中的Runnable大家应该很熟悉:多线程的接口。而IResourceChangeListener和IResourceDeltaVisitor是Eclipse系统中的资源接口,这里的资源是指Eclipse中的项目或文件等。在下面运行NoticeView插件的过程中你可以通过添加、打开、删除项目或文件来触发这两个接口中的事件,并在我们的观察窗口中显示相关信息。

在程序中比较希奇部分的是在resourceChanged()函数里面,并没有象大家想象的那样直接调用label.setText()方法来显示信息,而是调用了disp.syncExec(this),其中的disp是Display类型的对象。这是因为resourceChanged()方法运行的线程和lable所在插件运行的Eclipse主线程并不是同一个线程,假如直接调用label.setText()方法,会抛出一个异常。

下面还需要对项目中的plugin.xml进行一些改动,主要就是加上扩展点声明:

<?xml version="1.0" encoding="UTF-8"?>
<plugin
   id="com.nidapeng.eclipse.plugin.pde"
   name="Pde Plugin"
   version="1.0.0"
   provider-name="NIDAPENG"
   class="com.nidapeng.eclipse.plugin.pde.PdePlugin">
<requires>
   <import plugin="org.eclipse.core.runtime"/>
   <import plugin="org.eclipse.core.resources"/>
   <import plugin="org.eclipse.ui"/>
</requires>
<runtime>
   <library name="pde.jar"/>
</runtime>
<extension
      id="NoticeView"
      name="Notice View"
      point="org.eclipse.ui.views">
   <category
         name="Notice"
         id="com.nidapeng.eclipse.plugin.pde.category1">
   </category>
   <view
         name="Notice Resource View"
         category="com.nidapeng.eclipse.plugin.pde.category1"
         class="com.nidapeng.eclipse.plugin.pde.NoticeView"
         id="com.nidapeng.eclipse.plugin.pde.view1">
  </view>
</extension>
</plugin>


这个xml文件和Welcome插件的plugin.xml非常接近,这里就不做过多的说明了。

要运行这个插件,可以直接用Eclipse中的运行按钮,因为这个项目是一个Plug-in Project,此时项目会自动以Run-time Workbench方式运行。运行后,会生成一个和当前Eclipse完全一致的平台,在这个平台上可以直接运行NoticeView插件,查看这个插件到底会执行什么功能,也可以用直接Run-time Workbench方式调试插件。这里省去了安装插件,重启动Eclipse等过程,可以看到用PDE开发插件的过程比直接用Java开发环境简洁了很多!

Eclipse的开发不仅仅限于插件的开发,它还可以取代Java中的标准Swing,进行基于Java的独立应用程序GUI开发。它带来的好处是显而易见的:高速,资源占用低,跨平台,代码开放,有大公司的支持等等。

由于Eclipse目前还在开发阶段,笔者在用它调试程序时发现有些性能还不是十分的稳定,一些地方会碰到希奇的问题,要求使用者能想一些办法解决。不过,以现在Eclipse的开发速度,相信过不了多久,它的各种功能会逐步完善。目前Eclipse虽然有种种不足,但瑕不掩玉,笔者对Eclipse的总体印象还是非常不错的,运行速度,资源占用都要好于IVJ,操作起来也大多顺手,而且即使在现阶段也很少有意外退出等重大的Bug发生,希望未来的Eclipse能真正达到IVJ的功能,VisualCafe的速度,成为广大程序员开发软件的一大利器!

参考资源:

www.eclipse.org是Eclipse的资源总站。


上一篇:在Eclipse中使用JUnit 人气:780
下一篇:应用Rational工具简化基于J2EE项目(五)架构与设计 人气:473
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-13 爬爬思特新闻管理系统 v2.0 Beta1
2008-10-13 Pligg v9.9.5 Beta
2008-10-13 广优邮件发送系统 v2.1
2008-10-13 缤纷互动视频交友 v3.1 RC
2008-10-13 MyShop网络商城 build 081005
2008-10-13 Chyrp 超轻量级开源博客引擎 v2.
2008-10-13 162100静态(论坛/文章)系统 v2.4
2008-10-13 金博人才招聘求职网黄金版 v4.2
2008-10-13 愚人笔记 v4.0
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成