【原创】插件开发入门 (十五)
上一篇 / 下一篇 2008-07-01 16:41:21 / 个人分类:Eclipse插件开发
Eclipse最有魅力的地方就是它的插件体系结构。在这个体系中重要的概念是扩展点(extension points)。扩展点就是在软件开发过程中暴露出来的接口。每一个插件都是在现有的扩展点上开发的,并可能还留有自己的扩展点,以便在这个插件上继续开发。
5G)L
b D ];c0
K}R*x!U$YZ/^+z)^*w#l0简介
ITPUB个人空间;[W1|(q6W${
Eclipse 平台是IBM向开发源码社区捐赠的开发框架,它之所以出名并不是因为IBM宣称投入开发的资金总数为4 000万美元,而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的、可扩展的体系结构。Eclipse 的价值是它为创建可扩展的集成开发环境提供了一个开放源码平台。这个平台允许任何人构建与环境和其他工具无缝集成的工具。工具与Eclipse无缝集成的关键是插件。除了小型的运行时内核之外,Eclipse中的所有东西都是插件。从这个角度来讲,所有功能部件都是以同等的方式创建的。
u.P j$\O`m0ITPUB个人空间:]y*f9vO3g
K
由于有了插件,Eclipse系统的核心部分在启动时要完成的工作十分简单:启动平台的基础部分和查找系统的插件。整个Eclipse体系结构就像一个大拼图,可以不断地向上加插件,同时,在现有插件上还可以再加插件。ITPUB个人空间K~!h$r*n D!`
ITPUB个人空间Q2O1n:Q:eb
aWI
开发“Hello,world”插件
!a7GE4W9@c z&|V0创建插件最简单的方法是使用Eclipse中专门为开发插件而设计的插件PDE(Plug-in Development Environment)。PDE 和 Java Development Tooling(JDT)IDE是 Eclipse 的标准扩展。PDE 提供了一些向导可以帮助创建插件。下面的“Hello,world”插件将通过PDE进行开发。
S!d/t!x^;u S)T0ITPUB个人空间+L7P H1X&^a'i ]N
下面是创建一个简单插件的操作步骤。
"M3bG]'f/~*uW0
0K ?3R
y#@)?G0(1)运行Eclipse。ITPUB个人空间+eF.[&I8^
3o(h{0TAE0单击Eclipse的“File”→“New”→“Other”菜单项,在弹出的对话框中选择Select对话框左边的Plug-in Development向导。如图1所示,选择Plug-in Project。
YSeq,?U2P4USJ6dj0
so`-b-C_R0
ITPUB个人空间aiid-`6c#oO
h
图1 新建插件对话框
,o$Z!xtC ISn0
X yUt6h*iPH0(2)单击“Next”按钮,弹出新建对话框,输入项目名称。此处使用了“com.test.helloworld”。单击“Next”按钮后弹出新建对话框页,如图2所示,插件标识就与项目名称相同。使用项目名称作为插件标识可以将该插件与另一个插件的名称发生冲突的机会减到最小。
$N8o!O$plvlr0
%bW'd*AG%\#P7jP0ITPUB个人空间$k?
F|x+m!z@ Z
图2 新建对话框向导ITPUB个人空间}ix#\#i(A8S1S^
ITPUB个人空间U7wW'^kfD`-rJ
(3)单击“Next”按钮,选择“Hello, world”,如图3所示。ITPUB个人空间(vp)t)[h:?
z
'mj&f4^sP0
ITPUB个人空间"k5p _5boQ dv
图3 新建插件向导ITPUB个人空间 K2~-G5^1@8h\!E
r%zXm&|A
@&l0}_,H0(4)单击“Finish”按钮,就可以创建用户想要建立的插件。
~-r3w-P b0ITPUB个人空间T@BG,LN:jQ
上例中通过插件创建向导创建了“Hello,world插件”,通过Eclipse的插件创建向导还能够创建其它扩展点插件的创建。ITPUB个人空间c3_H'{)v
ITPUB个人空间t/f3Sx1F!Y}1}
调试“Hello,world”插件
2\$f#F.FS
i0通过PDE不但能创建插件,还能够调试插件。在Eclipse中调试插件的步骤如下。
*F,dsV#tucnW&^0ITPUB个人空间h}[*ei,WQu#C ry
(1)单击“Run”→“Debug”菜单项。ITPUB个人空间}:`:j.d4h:p}!n I7s
ITPUB个人空间%e.`,y.aE:hx)}
(2)在弹出的对话框窗口中用鼠标右键单击“Eclipse Application”选项。
:Xv'r4a"y|0
kVr-^g~w0(3)单击“New”菜单项(或双击Eclipse Application树节点),创建调试插件配置参数对话框,并通过对话框设置插件的调试参数,如图4所示。ITPUB个人空间x7ly&y6|z9d(_`
ITPUB个人空间9Zf+[4r\6En
}
ITPUB个人空间Um A
H}8~ I`%A$V
图4 Debug环境参数设置
I;Y*ksT`zA0ITPUB个人空间%_!S
BF Z#dq/J
(4)单击“Debug”按钮。ITPUB个人空间TE3p%[5upMeE9nB
ITPUB个人空间/up#t-T`8p;YYT3y;O
现在已经启动了一个调试的Eclipse,可以看到图5显示的调试窗口。调试窗口多了一个“Sample Menu”菜单项,工具栏多了一个按钮,单击菜单或按钮将会弹出 “Hello,world”对话框。
'o#kk7Ap:Z Ookz0
ITPUB个人空间.`](G MPb0Xh`
ITPUB个人空间8R'}9O2^*d!Sj
图5 “Hello,world”插件效果图ITPUB个人空间(Q"l9iGI/s i2]
ITPUB个人空间z{#t{5^K
用户可以在程序中可执行到的位置设置断点,就可以和调试Java程序一样调试Eclipse插件了。ITPUB个人空间:c'Wnx*m([~
sH
d$|b]M0注意:如果在图4中选择Clear workspace data before lauching,表示每次调试插件时是否提示清空运行时刻的Workspace。可以选择“是”,表示重建运行时刻的Workspace。
UiM0Hz3jo0
za(k@?"L,H^0插件打包
ITPUB个人空间`-r{3bV
这一步是把用户开发的插件打包,供别人使用。具体步骤如下。ITPUB个人空间#JB}Qm%n;m@"i
Rc[9cxA0(1)选择“Hello,world”插件,单击鼠标右键,选择“Export”菜单,弹出图6所示的对话框。
+D7w;qS6I/a#`0ITPUB个人空间&U!}/wNR-Em
ITPUB个人空间 X#F
FJ"x/H/F)\-\
图6 插件打包对话框ITPUB个人空间Vme s6r['OHIOa
ITPUB个人空间8Xk/`6r'@LS&x
(2)输入用户想要打包的文件名。如果想把源文件也打包,可以选择“Include source code”复选框。现在“Hello,world”插件就已经成功打包了。
5L*` B.?#B
b&U0A0
*k`9ob!{1z/s$v0(3)把“Hello,world”插件解压缩拷贝到用户的Eclipse的Plugins目录下面。运行Eclipse,就可以在运行环境下看到“Hello,world”插件的身影了。ITPUB个人空间&PHbI-Rf$n I"DqL0f
(j6Oqq#v0通过Export 菜单对插件进行打包,实际上Eclipse会读取插件目录下的build.properties文件,通过它来描述需要打包的内容。
OhmrS_)t3n0ITPUB个人空间U P%k C+taJ
提示:不要把“Hello,World”插件拷贝到开发环境的Eclipse下面,否则插件可能不会被注册。因为开发环境的Workspace中有相同ID的插件,这样会产生冲突。要养成好习惯,把开发环境和部署环境分开。ITPUB个人空间L6f{AJt9vg
-qzI8Sum0插件描述文件
ITPUB个人空间-wL[m0|$k2}
W
Eclipse中插件的描术文件包括Plugin.xml文件和MANIFEST.MF:ITPUB个人空间)ECiwJ8fg!v%h6E
ITPUB个人空间$|^(mk8yFo
l Plugin.xml:Plugin.xml描述了扩展点的基本信息,包括扩展点的实现和定义,它按照扩展点的定义文件(schema)描述扩展的信息。
)?&}kBV%R-o)}0ITPUB个人空间k.K8I3C%l9EE
l MANIFEST.MF:MANIFEST.MF记录了插件的状态信息,包括插件的依赖关系、运行时的类加载路径以及插件的名称等。
2c(~ u$T}X"C-u e0
D]/[+W6[']t@z}0Plugin.xml主要是通过XML文件格式描述扩展点的具体内容。当Eclipse启动后,它将会找到所有插件的描述文件。当Eclipse第一次启动某一个插件时,它会从MANIFEST.MF文件读取插件的相关信息,并通过定义的插件类初始化插件。
$fx}:D7|0ITPUB个人空间\nb2~ N^W
插件描述文件编辑器窗口,如图7所示。ITPUB个人空间b@5uZ0b'~J0h
8\9wj"g1]0
I+?+I#E V%g3t0图7 清单文件编辑窗口
8_`Q#??BUBQ0ITPUB个人空间@ nw-_3t0G
Manifest.MF文件中保存了插件的基本信息(和OSGI相关的信息),而Plugin.xml文件记录了扩展点的信息,这两个文件在一个编辑器中展现,分成如下几个部分。
k0DlEx@eL0
X%qP1Bl[,a0d/e0l Overview:描述了插件的基本信息。
Ih/Q}'Q'@Te0
F"^(D1v/?
i#nh
m0l Dependencies:描述了插件的依赖关系。ITPUB个人空间,Bsc~+q]K;S
x.j8HY s!opQVR0l Runtime:指明运行时的ClassPath。ITPUB个人空间.F9_o i.C0Z
ITPUB个人空间!x
T0B/E,G"?fS
l Extensions:指明插件实现的扩展点。
&vPZ GS0A}|0ITPUB个人空间 k7Ia%u2? JsW!Du
l Extension Points:指明插件提供的扩展点。
z0_.TqGVs0ITPUB个人空间qi0S2[nk1Aje2n]a
1. OverView:描述了插件的基本信息
Cza;V/E0e0ITPUB个人空间X'bMB~_
OverView描述了插件的基本信息,如图8所示。ITPUB个人空间U:c|+f4?c5z'[
F
? cy
b.p1mi0
6XL$Xwi_,zn0图8 OverView页面ITPUB个人空间T3d
Y5I]
I6b8w
ITPUB个人空间P)~k`*snLP
l ID:ID是插件的ID号,在Eclipse中是一个具体标识。ITPUB个人空间#u{MH8R_.O S
1ak-utG|0l Version:Version指明用户所开发的插件的版本号。ITPUB个人空间#b6vG_&E_
ITPUB个人空间
~g
A.{1g:FPRd6~9t(@
l Name:指用户所开发的插件的名称。ITPUB个人空间j)Dj8a9JJGG.d