Eclipse集成开发环境使用说明 -- dreamingk [2004-07-24 15:47:24]
Contents
Eclipse集成开发环境使用说明
台湾著名的IT技术写译作家侯Sir在他的名作《深入浅出MFC》中说过“欲善工事,先利其器”,而开源世界中的Eclipse就是一种强大的集成开发环境,因其的plugin功能,使其支持总多的开发语言,当然包括Python,您可以在http://www.eclipse.org更多关于它的资料 (当然各位Emacs高手尽可以忽略掉这篇文章的存在):)
Eclipse 平台入门
参见 http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-ecov/index.shtml
本文为您提供关于 Eclipse 平台的概述,包括其起源和体系结构。本文首先简要讨论 Eclipse 的开放源代码性质及其对多种编程语言的支持,然后通过一个简单的程序例子展示 Java 开发环境。本文还将考查以插件扩展形式可用的一些软件开发工具,并展示一个用于 UML 建模的插件扩展。
用 Eclipse 和 Ant 进行 Python 开发
参见 http://www-900.ibm.com/developerWorks/cn/opensource/os-ecant/index.shtml
Python 是一种非常灵活强大的动态脚本编程语言,具有完整的面向对象特性。众多的支持者指出,Python 语言与其他语言相比能更快更有效地表达出他们的意图。但是从 Java 技术™ 或 Microsoft® .NET 刚刚转到 Python 的人会发现,功能丰富而精致的 IDE 和开发工具都不见了。那些开发人员可以从他们熟悉的 Java 开发工具中找到解决方案。本文着重介绍了如何使用基于 Java 技术的流行开发工具 Eclipse 和 Ant 进行 Python 开发。
其他的请参见 developerWorks 上所有 Eclipse 文章
Eclipse的插件
From :: http://blog.huangdong.com/ HD 个人blog!
有关Eclipse的插件安装
Eclipse中的插件都存在plugin目录下,时间久了,会发现plugin目录中的目录多的管理不过来,在my Eclipse中发现了Eclipse的插件的安装都在另一个目录下,这样说明可以使用link来安装plugin的。
Eclipse也会到文件系统的其他位置来寻找插件,在eclipse\links目录下面可以放置一个链接文件,那么这些文件将会被处理,根据文件中的信息去寻找另外的插件。
一个链接文件只是一个命名为id.link的任意文件,id我是任意取得,链接文件是如下的格式,
path=e:/eclipse/custom
Eclipse就会到上面指定的目录下面去查找eclipse\features和eclipse\plugins目录,看里面是否有合法的插件,并且进行加载。这样的话可以将后来自己加的一些插件放在自己定义的目录里面,可以保持eclipse的纯洁性,便于管理。
这样我们就可以将自己喜欢的插件装在一个单独的目录下,如果Eclipse升级,只需要将原来的目录删除,装一个新的,把link文件copy过去就好了
呵呵,搞Eclipse插件的开发让我更了解了Eclipse,感觉越来越好哟
Eclipse的插件扩展点--org.eclipse.ui.actionSets
操作集 用来将菜单、菜单项和工具栏按钮添加到“工作台”窗口中的公共区域。将这些添加项统称为操作集并由定制透视图的用户安排出现在“工作台”窗口中。
在Eclipse中所有的菜单、菜单项和工具栏按钮都是扩展这个扩展点而产生的。
在配置说明的xml中需要关注以下内容: class — 实现 org.eclipse.ui.IWorkbenchWindowActionDelegate 或 org.eclipse.ui.IWorkbenchWindowPulldownDelegate 的类的全限定名。后者应在 style 属性具有值 pulldown 的情况下实现。此类是负责执行操作的处理程序。如果 retarget 属性为 true,则忽略并且不应提供此属性。 menubarPath — 用来指定菜单栏中操作位置的以斜杠(“/”)定界的路径。路径中的每个标记(最后一个标记除外)都必须表示层次结构中现有菜单的有效标识。最后一个标记表示要将操作添加到其中的命名组。如果省略了路径,则此操作将不会出现在菜单栏中。 toolbarPath — 用来指定工具栏中操作位置的以斜杠(“/”)定界的路径。第一个标记表示工具栏标识(“Normal”表示是缺省工具栏),而第二个标记是此操作将添加至的工具栏内的命名组。如果工具栏内不存在该组,则将会创建它。如果省略了 toolbarPath,则操作将不会出现在工具栏中。
Eclipse的插件扩展点--org.eclipse.ui.editors
内部编辑器和外部编辑器 用来将新编辑器添加至工作台。编辑器是工作台页面内的可视组件。它通常用来编辑或者浏览文档或输入对象。要打开编辑器,用户通常会对 IFile 调用“Open”。执行此操作时,会查询工作台注册表以确定文件类型的适当编辑器,然后创建该编辑器类型的新实例。实际结果取决于编辑器的类型。工作台提供了对创建内部编辑器(它们是紧密地集成到工作台中的)和创建外部编辑器(它们是在独立的框架窗口中启动的)的支持。在这两种极端情况之间还有各种级别的集成。
在内部编辑器的情况下,可实现工作台窗口与编辑器部件之间的紧密集成。工作台菜单和工具栏预装入了许多公共操作(如剪切、复制和粘贴)。活动的部件、视图或编辑器应会提供这些操作的实现。内部编辑器还可定义出现在工作台窗口中的新操作。仅当编辑器活动时,这些操作才会出现。
工作台与外部编辑器之间的集成则更为细微一些。在这种情况下,工作台可以启动编辑器但自此以后,除了通过文件系统之外它再没有任何办法确定外部编辑器的状态或与它合作。
在配置说明的xml中需要关注以下内容: extensions — 包含编辑器理解的文件类型列表的可选字段。这是一个包含用逗号分隔的文件扩展名的字符串。例如,理解超文本文档的编辑器可能会对“htm, html”注册。 class — 实现 org.eclipse.ui.IEditorPart 的类的名称。class 和 command 属性是互斥的。如果定义了此属性,则还应定义 contributorClass。 command — 要运行以启动外部编辑器的命令。可执行命令必须位于系统路径上或者位于插件的目录中。class 和 command 属性是互斥的。 contributorClass — 实现 org.eclipse.ui.IEditorActionBarContributor 的类的名称。仅当定义了 class 字段后,才应定义 contributorClass 字段。此类用来将反映编辑器类型功能的新操作添加到工作台菜单和工具栏中。 launcher — 实现 org.eclipse.ui.IEditorLauncher 的类的名称。启动器将打开外部编辑器。class、command 和 launcher 属性是互斥的。
如果使用 command 属性,则会将它视作将以与平台有关的方式执行的外部程序命令行。 如果使用的是 launcher 属性,则也会将编辑器视作外部程序。在这种情况下,指定的类必须实现 org.eclipse.ui.IEditorLauncher。将实例化启动器,然后将调用 open(IFile file) 来启动编辑器。 如果使用的是 class 属性,则工作台将假设它是内部编辑器且指定的类必须实现 org.eclipse.ui.IEditorPart。通常的做法是在定义新的编辑器类型时子类化 org.eclipse.ui.EditorPart。也有必要定义 contributorClass 属性。指定的类必须实现 org.eclipse.ui.IEditorActionBarContributor,且用来将反映编辑器类型功能的新操作添加到工作台菜单和工具栏中。
添加程序将会把新的操作添加至反映编辑器类型的工作台菜单和工具栏。这些操作是共享的,且当调用它们时,它们对活动编辑器起作用。通过调用 IEditorActionBarContributor.setActiveEditor,活动编辑器被传递至添加程序。工作台窗口中的操作和主组的标识是在 org.eclipse.ui.IWorkbenchActionConstants 中定义的。这些应该用作用于添加新操作的引用点。
Eclipse的插件实现--编辑器
编辑器没有“典型”实现模式,原因是编辑器通常提供特定于应用程序的语义。编辑和管理特定资源类型的工具将提供定制行为来处理由资源提供的数据。
编辑器可以具有各种形状和大小。如果插件的编辑器是基于文本的,则编辑器可以使用现有的缺省文本编辑器,也可以通过使用平台中提供的设施来创建定制的文本编辑器。
如果插件的编辑器不是基于文本的,则插件必须实现定制编辑器。可以有几种方法来构建定制编辑器,所有这些方法都取决于编辑器的外观和行为。
1.基于表单的编辑器可以类似于对话框或向导的方式来对控件进行布局。“插件开发环境”(PDE)使用此方法来构建它的清单编辑器。 2.可以使用 SWT 级别代码来编写图形增强编辑器。例如,编辑器可以创建它自己的 SWT 窗口来显示信息,或者它可以使用对应用程序优化的定制 SWT 控件。 3.面向列表的编辑器可以使用 JFace 列表、树和表查看器来处理它们的数据。
一旦已经确定了编辑器的实现模型,实现编辑器就类似于为独立的 JFace 或 SWT 应用程序编程。平台扩展用于添加支持编辑器所需要的操作、首选项和向导。但是编辑器的内部结构很大程度上依赖于应用程序设计原理和内部模型。
编辑器必须实现 IEditorPart,并且通常是通过扩展 EditorPart 类来构建的。编辑器在 createPartControl 方法中实现它的用户界面。此方法用来组装提供编辑器内容的 SWT 小窗口或 JFace 查看器。
编辑器输入是对要编辑的内容的描述。可以将编辑器输入看作是文件名,尽管它更常见一些。 IEditorInput 定义编辑器输入的协议,包含输入的名称以及在编辑器顶部的标号中应该用来表示它的图像。
在平台中提供了两个一般编辑器输入。IFileEditorInput 表示在文件系统中作为文件的输入。IStorageEditorInput 表示作为字节流的输入。这些字节可能来自不同于文件系统的源。
如果编辑器可以支持进行时替换编辑器的输入对象,则应当实现 IReusableEditor。通过实现此接口允许工作台“回收”编辑器。工作台用户首选项允许用户规定在打开一定数量的编辑器之后就应当重用编辑器。
如果想要在编辑器中实现导航历史记录,则应当实现 INavigationLocationProvider。这为工作台提供了请求保存导航历史记录所需要的当前导航位置(INavigationLocation)的机制。工作台处理导航用户界面的机制。当需要将编辑器恢复至它表示的位置时,将通知 INavigationLocation。
Eclipse的插件实现--缺省文本编辑器
如果每一次自定义编辑器插件我们都要自己书写IEditorPart的实现,哪么会是一个很艰苦而重复的劳动。Eclipse提供了一个缺省的用于文本编辑的接口和缺省实现。用于文本编辑的接口在 ITextEditor 中被定义为 IEditorPart 的特定于文本的扩展。
ITextEditor 的实现是按层构造的。AbstractTextEditor 定义用于扩展编辑器以支持文本的源代码样式编辑的框架。此框架是在 org.eclipse.ui.texteditor 中定义的。
具体实现类 TextEditor 定义标准平台文本编辑器的行为。它是在 org.eclipse.ui.editors.text 包中定义的。
文本编辑器框架提供了独立于模型的编辑器,它支持下列功能部件:
- 文本的表示和用户修改
- 标准文本编辑操作,例如,剪切/复制/粘贴以及查找/替换
- 对上下文菜单和下拉菜单的支持
- 标尺中文本注释的可视表示或作为文本中的波浪线
- 当用户编辑文本时自动更新注释
- 附加信息(例如,行号)的表示
- 语法突出显示
- 内容辅助
- 显示文本的分层结构的文本概述页面
- 上下文相关的行为
- 标尺和文本上的悬浮式帮助支持
- 键绑定作用域
- 首选项处理
用Eclipse创建InfoCenter
在开发过程中,总是需要频繁的查看API 文档,也收集了很多常用的API文档,如JDK,JSP,Servlet,Hibernate,Struts…. 以前总是吧这些API解压到目录下,用IE逐个查看。有个不好的地方就是,当你想把这些文档复制到别的地方时,数万个html拷贝起来总是很慢很慢,再一个就是无法实现搜索。 在看了Eclipse 的help之后,发现它把所有的html压缩成doc.zip,然后用plugins的方式把各个文档串起来,这样既实现了文件数量少,又实现了搜索,这样就很方便了。其实这样的功能netbeans也有。
查看了eclipse的帮助之后,可以把eclipse help单独做成一个web server,这样就可以做到把所有的api文档以plugins的方式组织起来,然后所有人就可以在这个help infocenter上进行查看和搜索了。
Eclipse的插件实现--编辑器的文档提供程序和文档
当创建编辑器时,编辑器就会与编辑器输入(IEditorInput)(它描述正在被编辑的对象)相关联。
当用户打开具有“*.jav”扩展的文件时,将打开 Java 编辑器示例。在这种情况中,编辑器的输入是 IFileEditorInput。平台文本框架很少对编辑器输入本身作出假设。它对输入使用称为 IDocument 的表示模型,因此,它可以有效地显示和处理文本。
这意味着必须具有一种方法从期望的域模型(编辑器输入)映射至表示模型。在 IDocumentProvider 中定义了此映射。只要给定编辑器输入,文档提供程序就会返回适当的 IDocument。
有两种使文档提供程序与文件关联并最终被编辑器所使用的方法,一种是使用org.eclipse.ui.documentProviders扩展点,声明一个provider,并告诉它extensions(扩展名)、class (文档处理器实现类)。
另一种方法则是当将输入元素设置到编辑器中时,编辑器就会要求其插件类提供适当的文档提供程序。插件可以管理文档提供程序的创建和引用。当文档提供程序涉及到特殊的初始化或其它处理时,采用此技术可能会比较好。如:
public XMLEditor() { super(); setDocumentProvider(new XMLDocumentProvider()); }
无论任何一种情况,我们所使用的文档提供程序都会是IDocumentProvider的实现,在Eclipse中我们可以使用到它默认的一些文档提供程序(也可以自己继承后形成自己的文档提供类):
org.eclipse.jface.text.ProjectionDocument org.eclipse.jface.text.Document org.eclipse.ui.editors.text.FileDocumentProvider
Eclipse的插件实现--编辑器的contributorClass
看了编辑器的类,一直不能理解contributorClass的用途在哪里,为什么一定要定义这样的一个类描述。这也是编辑器开发中需要理解的地方。这是原本的说明: contributorClass — 实现 org.eclipse.ui.IEditorActionBarContributor 的类的名称。仅当定义了 class 字段后,才应定义 contributorClass 字段。此类用来将反映编辑器类型功能的新操作添加到工作台菜单和工具栏中。
contributorClass指定的类必须实现 org.eclipse.ui.IEditorActionBarContributor,它的作用为将反映编辑器类型功能的新操作添加到工作台菜单和工具栏中。添加程序与编辑器本身是分开的,原因是任何给定工作台页面都可以具有同一类型的多个编辑器。单个添加程序是由特定类型的所有编辑器共享的,而不是让一个编辑器的每个实例创建操作和图像。 我们假定一个叫做ReadmeEditorActionBarContributor的一个实现,哪么它的构造器将会定义一系列的操作:
public ReadmeEditorActionBarContributor() { ... action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE); action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE); ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... }
需要注意的是,操作的名称和图标是在代码中而不是在 plugin.xml 中设置的。在plugin.xml中是不知道在编辑器中有什么样的操作的。原因是我们需要管理同一编辑器的不同实例之间的操作的共享。在构造函数中创建操作时,它们独立于编辑器的任何特定实例。
当编辑器活动,并且它的操作需要安装在工作台菜单和工具栏中时,将把 setActiveEditor 消息发送至添加程序。添加程序将编辑器操作与特定编辑器相连接。
public void setActiveEditor(IEditorPart editor) { ... action1.setActiveEditor(editor); ... }
这时,action所定义的菜单或是工具栏图标就会出现在Eclipse相应的位置。
再加一个,如果你不想做特别的定制,哪么
org.eclipse.ui.part.EditorActionBarContributor org.eclipse.ui.texteditor.BasicTextEditorActionContributor org.eclipse.ui.part.MultiPageEditorActionBarContributor
会是你的选择,特别是后两者,可以对应到特定的编辑器情况下。