Eclipse插件开发文档记录.docx
《Eclipse插件开发文档记录.docx》由会员分享,可在线阅读,更多相关《Eclipse插件开发文档记录.docx(32页珍藏版)》请在冰豆网上搜索。
Eclipse插件开发文档记录
Eclipse插件开发文档记录
一、参考网站
二、插件开发之基础篇
(1)
名词翻译
有一些名词在翻译的过程中可能会出现歧义,在这里统一一下。
アーキテクチャ=architecture=架构
プラットフォーム=platform=平台
コンポーネント=component=组件
其余的随时补充。
的架构
Eclipse被作为java的IDE(集成开发环境)被广泛的应用,但是从本质上看Eclipse是一个整合了各种开发工具的平台。
因此,它采用了可以自由的增加各种功能的插件架构技术。
Eclipse平台的基本架构如图1-1所示。
图1-1Eclipse的架构
在这里,在最底层位置的是作为Eclipse插件架构基干的OSGi运行时。
虽然在早期的Eclipse版本中已经开始使用插件架构了,但是在的时候才首次引入了OSGi。
OSGi是openservicesgatewayinitiative的简称、原本是一种为嵌入式硬件开发的,使网络上的服务提供者和使用者交互(結びつける)的注册服务。
Eclipse使用OSGi来进行插件的管理。
OSGi运行时之上所有被配置的组件群都是以插件的方式提供的。
SWT和JFace提供了用户接口(UserInterface)的API。
由于SWT和JFace并不依赖于Eclipse,也有可能被作为类库单独使用。
Eclipse不仅把基本的用户接口作为工作台API(WorkBenchAPI)提供出来,在后面要讲到的工作区(Workspace)内的资源通过资源API(ResourceAPI)的形式也被作为基本API提供出来了。
在这之上构建起了帮助系统以及基于更新管理器的自动更新等功能。
从Eclipse平台的角度看,SWT、JFace、工作台的部分就是EclipseRCP(RichClientPlatform)。
EclipseRCP是基于Eclipse的富客户端技术,Eclipse不仅是一个开发工具,也可以作为一个通用的应用程序平台。
EclipseRCP是Eclipse平台的子集,同时,Eclipse自身也是一个EclipseRCP的运用实例。
2.扩展点
插件为了自身能够对其他插件进行扩展而提出了扩展点的概念。
当要为插件增加功能的时候就可以利用这个扩展点。
在扩展点的基础上,插件之间可以互相连接。
图1-2使用扩展点进行扩展
扩展和扩展点的连接在程序执行时被建立,提供扩展点的插件事先并不知道该扩展点实际被扩展了什么样的行为。
使用扩展点的插件需要在清单文件中像代码1-1那样,使用extension元素声明扩展。
extension元素中的schema由提供扩展点的插件决定,元素中的内容必须按照schema进行书写。
代码1-1中声明扩展
1
2
3
......
像上面这样的扩展点和扩展不断的积累重叠,使得Eclipse平台能够实现各种各样的功能。
Eclipse平台提供的扩展点有
增加菜单项
增加视图
增加编辑器
等等,数量非常的多。
本文将以使用频率相对较高的扩展点为中心进行介绍,在Eclipse的帮助中有Eclipse提供的所有扩展点的说明,大家在使用时可以参考。
当然,定义一个新的自制插件是绝对可能的。
扩展点的定义方法会在[扩展点定义]章节中为大家详细介绍。
3.工作台(Workbench)
在这里认为看到本文的同学们都曾经用Eclipse做过java的开发。
Eclipse的各个部分的名称大家也许都已经知道了。
为了在以后的文章中统一意识,在这里我们再复习一下。
工作台是Eclipse的整个用户接口的统称。
工作台内的结构见图1-3
图1-3工作台
工作台窗口
Eclipse的窗口。
通常一个工作台会打开一个窗口,但是也可能一个工作台对应多个窗口。
工作台页面
在工作台上打开的每个透视图(用于特定用途的视图、编辑器的布局)和一个页面对应。
可以包含多个视图和编辑器。
菜单栏
和一般的GUI应用一样的菜单栏区域。
工具栏
和一般的GUI应用一样的工具栏区域。
默认情况下工具栏的右边区域用来显示透视图的列表
状态栏
通常在画面的最下面显示的区域。
编辑器的光标位置、生成进度状况等根据工作台上的操作内容显示各种信息。
视图
作用是提供开发者想要的信息。
可以收到状态栏内,必要时再打开(高速视图)。
基本上一个视图在一个工作台内只能打开一个。
编辑器
主要用于文件的编辑。
和视图不同编辑器可以同时打开多个。
对于同一个文件也可以打开多个编辑器。
从插件的代码中访问工作台使用类。
代码1-2说明了从PlatformUI中取得工作台和工作台窗口的代码示例。
代码1-2使用PlatformUI访问工作台
1
2
3
4
5
6
7
8
作区和资源API
在Eclipse中使用工作区作为开发人员的作业区域。
工作区是在Eclipse启动时指定的一个物理文件夹。
开发人员在Eclipse上生成工程、创建文件等操作都会在工作区指定的文件夹内生成实际的文件。
工作区内的资源在Eclipse内部使用包中定义的虚拟对象进行操作,例如工程是IProject、文件夹是IFolder、文件时IFile。
图1-4工作区内的资源
在插件开发的时候很多情况都会使用到工作区内的文件或者文件夹。
这时就可以使用这些对象。
对工作区的访问需要使用。
代码1-3是利用IWorkspaceRoot,去的工作区内的工程的代码示例
代码1-3使用ResourcesPlugin访问工作区
1
2
3
4
etRoot();
成插件工程
通过选择[文件]->[新建]->[工程...]启动[新工程(NewProject)]向导。
在插件开发的时候我们就不能选择通常的java工程了,要选择新建一个插件工程。
选择[插件工程(Plug-inProject)]后点击[下一步(Next)](图2-1)。
下一步,输入一个适当的项目名(图2-2)。
习惯上项目名和插件的ID是相同的。
插件ID和java包的命名方式相同,必须一个世界范围唯一的名称。
在这里用作为项目名称(=插件ID)。
点击[下一步(Next)]。
图2-1生成插件工程
图2-2输入插件信息
输入[插件ID]、[插件版本]、[插件属性(插件作者)](图2-3)等信息。
[插件ID]会被自动设成之前输入的[工程名]。
没有其他特别的设定的话继续点击[下一步(Next)]。
图2-3输入生成工程必要的信息
图2-4模板选择
图2-5输入模板信息
根据选择的模板生成的插件在(图2-5)的画面可以修改一些信息。
如果没有特别需要设定的地方点击[完成(Finish)],生成工程。
PDE透视图
插件工程生成后,就会切换到PDE(插件开发)透视图。
工程此时根据选择的[Hello,World]模板生成了插件的源代码,并且打开了manifest编辑器。
图2-6PDE(插件开发)透视图
2.插件的动作
接下来我们看一下插件的动作。
manifest编辑器的[概要]页面右侧[启动Eclipse应用(LuanchanEclipseapplication)](图2-7)。
点击后,会启用一个新的Eclipse实例。
这个新的实例被称为[运行时工作台]。
运行工作台可以以嵌入当前正在开发的插件的状态启动,以使开发者可以对插件的动作进行确认。
图2-7启动运行时工作台
启动的运行时工作台,会在菜单栏上增加一个新的菜单项。
这个菜单项就是插件的代码追加上去的。
在工具栏上也增加了一个相应的按钮。
工具栏上的按钮和菜单项目效果相同,都会出现一个[Hello,EclipseWorld]的对话框。
Eclipse版的HelloWorld就完成了。
确认完这些动作后,就可以关闭当前的运行时工作台了,咱们在下个小节的讲解中还要去参考插件工程的代码呢~
图2-8示例中新增的菜单项和工具栏按钮以及相应的动作
和
一个插件包含和两个配置文件。
是OSGi的handler配置文件,记录了插件ID、名称、作者、和其他插件的依赖关系等。
记录了插件的扩展和扩展点的定义等信息。
以前由于还没有采用OSGi技术,插件的所有信息都记录在里。
所以应用在以前版本的插件如果要应用于和以后版本时要注意遵守OSGi的配置文件定义规范。
3.PDE的功能
PDE(插件开发环境·PluginDevelopmentEnviromment)提供了插件开发的各种功能。
因为插件的开发使用java语言,所以也会使用到java编码工具JDT。
Manifest编辑器
PDE提供的功能中最重要的就是Manifest编辑器。
编辑器可以为插件的两个配置文件提供图形化的编辑功能。
(图2-9)
编辑器的配置项目非常多,可以通过编辑器下面的tab页切换设定画面。
图2-9Manifest编辑器
表1Manifest编辑器各tab页
页面
说明
Overview
可以设定插件的概要信息。
生成用于发布的文档以及启动运行时工作台。
Dependencies
设定插件间的依赖关系。
Runtime
可以设置导出包和ClassPath。
Extensions
管理当前插件对扩展点的扩展。
ExtensionPoints
管理当前插件的扩展点。
Build
生成工程时的各种设定。
显示的源代码
显示的源代码
显示的源代码
在Overview以外的tab页上部会显示一些快捷键按钮,使用这些按钮也可以进行启动运行时工作台,导出等操作。
图2-10编辑器上部
下面介绍一下PDE题供的几种视图。
在[Window]->[ShowView]中可以找到没有被显示的视图。
[插件(Plug-ins)]视图
所有的插件列表,包含当前工作区内正在开发的插件。
打开插件节点可以显示插件下包含的资源,但是以jar包提供出来的插件就显示不出来了。
在插件节点上点击右键选择[打开依赖关系(OpenDependencies)]可以打开后面要介绍的[依赖关系]视图,表现插件间的依赖关系。
右键菜单中也可以把选中的插件作为一个工程引入到当前工作区内。
[依赖关系(Plug-inDependencies)]视图
表现了插件间的依赖关系。
可以分别表示当前插件依赖的插件和依赖当前插件的插件。
[插件注册(Plug-inRegistry)]视图
当前工作台加载的所有插件列表。
打开插件节点,显示插件提供的扩展和扩展点、依赖关系等。
[错误Log(ErrorLog)]视图
错误Log视图虽然不是PDE提供的功能,但是在插件开发的时候非常有用。
它可以表现当前工作台内发生的错误,并且在错误上双击既可以导向到错误发生的地方。
Plugin-inSelection Spy
同时按下alt+shift+F1
Plugin-inSelection Spy是从开始加入的新功能,能够显示当前焦点所在的编辑器、视图、向导、对话框等的内部信息。
把已有的插件作为参考,进行插件开发,使用这个功能是再合适不过了。
4.解读示例插件的代码
让我们回到插件工程来,看一看插件工程生成的代码。
首先看一下的代码。
代码2-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
point="">①
label="SampleActionSet"
visible="true"
id="">
label="&SampleAction"
icon="icons/"
class=""②
tooltip="Hello,Eclipseworld"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
id="">
为了在菜单栏增加一个项目,文件中使用了extension元素。
①的id指定了扩展点的名称。
extension里的内容根据扩展点而不同。
示例插件中包含了actionSet、menu、action等元素。
②中的class属性指定了类作为响应菜单或者工具栏按钮的action类。
代码2-2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package
import
import
import
import
import
/**
*Oursampleactionimplementsworkbenchactiondelegate.
*Theactionproxywillbecreatedbytheworkbenchand
*shownintheUI.Whentheusertriestousetheaction,
*thisdelegatewillbecreatedandexecutionwillbe
*delegatedtoit.
*@seeIWorkbenchWindowActionDelegate
*/
publicclassSampleActionimplementsIWorkbenchWindowActionDelegate{
privateIWorkbenchWindowwindow;
/**
*Theconstructor.
*/
publicSampleAction(){
}
/**
*Theactionhasbeenactivated.Theargumentofthe
*methodrepresentsthe'real'actionsitting
*intheworkbenchUI.
*@seeIWorkbenchWindowActionDelegate#run
*/
publicvoidrun(IActionaction){ ...①
(
(),
"Sample",
"Hello,Eclipseworld");
}
/**
*Selectionintheworkbenchhasbeenchanged.We
*canchangethestateofthe'real'actionhere
*ifwewant,butthiscanonlyhappenafter
*thedelegatehasbeencreated.
*@seeIWorkbenchWindowActionDelegate#selectionChanged
*/
publicvoidselectionChanged(IActionaction,ISelectionselection){
}
/**
*Wecanusethismethodtodisposeofanysystem
*resourceswepreviouslyallocated.
*@seeIWorkbenchWindowActionDelegate#dispose
*/
publicvoiddispose(){
}
/**
*Wewillcachewindowobjectinorderto
*beabletoprovideparentshellforthemessagedialog.
*@seeIWorkbenchWindowActionDelegate#init
*/
publicvoidinit(IWorkbenchWindowwindow){
=window;
}
}
①run()方法内记录了action执行时的处理。
利用方法打开了一个对话框。
咱们再看看生成的另外一个类--Activator类。
这个类对插件的生命周期进行了管理,被称为插件类。
代码2-3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package
import
import .①
import
/**
*Theactivatorclasscontrolstheplug-inlifecycle
*/
publicclassActivatorextendsAbstractUIPlugin{
..③
(context);
plugin=this;
}
/*
*(non-Javadoc)
*@see
*/
publicvoidstop(BundleContextcontext)throwsException{.④
plugin=null;
(context);
}
/**
*Returnsthesharedinstance
*
*@returnthesharedinstance
*/
publicstaticActivatorgetDefault(){.②
returnplugin;
}
/**
*Returnsanimagedescriptorfortheimagefileatthegiven
*plug-inrelativepath
*
*@parampaththepath
*@returntheimagedescriptor
*/
publicstaticImageDescriptorgetImageDescriptor(Stringpath){
returnimageDescriptorFromPlugin(PLUGIN_ID,path);
}
}
示例中的插件类继承自AbstractUIPlugin(①)。
如果没有UI的插件继承AbstractUIPlugin的父类Plugin就可以了。
插件类的方法如下表所示:
getDefault()
取得插件类的实例的方法。
插件类是单例的,所以这个方法作为一个静态方法提供。
start()
插件开始时的处理。
stop()
插件停止时的处理。
getLog()
log输出时取得ILog用的方法。
getImageRegistry()
取得管理插件内图像的ImageRegistry类。
getPerferenceStore()
取得保存插件设定的IPerferenceStore类。
getDialogSettings()
取得保存对话框设定的IDialogSettings类。
getWorkbench()
取得IWorkbench的实例。
以上就是根据[HelloWorld]模板生成的插件的代码讲解,在PDE中为我们准备了很多的模板,大家可以都试试看。
三、Eclipse插件开发之基础篇(3)插件的测试与调试
1.使用JUnit对插件进行测试
Ec