【原创】插件开发入门 (十五)

上一篇 / 下一篇  2008-07-01 16:41:21 / 个人分类:Eclipse插件开发

Eclipse最有魅力的地方就是它的插件体系结构。在这个体系中重要的概念是扩展点(extension points)。扩展点就是在软件开发过程中暴露出来的接口。每一个插件都是在现有的扩展点上开发的,并可能还留有自己的扩展点,以便在这个插件上继续开发。
K(O/TQN){0ITPUB个人空间Y+dH$[Y-S5@
简介


0X k/rb%K%V v9`0Eclipse 平台是IBM向开发源码社区捐赠的开发框架,它之所以出名并不是因为IBM宣称投入开发的资金总数为4 000万美元,而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的、可扩展的体系结构。Eclipse 的价值是它为创建可扩展的集成开发环境提供了一个开放源码平台。这个平台允许任何人构建与环境和其他工具无缝集成的工具。工具与Eclipse无缝集成的关键是插件。除了小型的运行时内核之外,Eclipse中的所有东西都是插件。从这个角度来讲,所有功能部件都是以同等的方式创建的。ITPUB个人空间,Ztx`)nRh

jU(J2L7YLe u0由于有了插件,Eclipse系统的核心部分在启动时要完成的工作十分简单:启动平台的基础部分和查找系统的插件。整个Eclipse体系结构就像一个大拼图,可以不断地向上加插件,同时,在现有插件上还可以再加插件。ITPUB个人空间 ae4} |y GN?8x

-g/F7y.z~S,gw0开发“Hello,world”插件


u0\-ziOx0创建插件最简单的方法是使用Eclipse中专门为开发插件而设计的插件PDE(Plug-in Development Environment)。PDE 和 Java Development Tooling(JDT)IDE是 Eclipse 的标准扩展。PDE 提供了一些向导可以帮助创建插件。下面的“Hello,world”插件将通过PDE进行开发。ITPUB个人空间5iQYi9Ma? R&`.`

'D%O#x6u.v0下面是创建一个简单插件的操作步骤。ITPUB个人空间 K-saJ$V `!F3j,y
ITPUB个人空间|;k-N ?4X!DZ[
(1)运行Eclipse。ITPUB个人空间3c%\T$]6xre'H'q+R;G_
ITPUB个人空间4O7HIH k.@Fwg
单击Eclipse的“File”→“New”→“Other”菜单项,在弹出的对话框中选择Select对话框左边的Plug-in Development向导。如图1所示,选择Plug-in Project。
"J N,Je&xI_4{*\;T0
2G"wQx7n~ } P f0ITPUB个人空间#Zks1R!_r sV8s8w
图1 新建插件对话框ITPUB个人空间+n'uR%ib:S7I+w

9YgY8V V&XbVB+I0(2)单击“Next”按钮,弹出新建对话框,输入项目名称。此处使用了“com.test.helloworld”。单击“Next”按钮后弹出新建对话框页,如图2所示,插件标识就与项目名称相同。使用项目名称作为插件标识可以将该插件与另一个插件的名称发生冲突的机会减到最小。ITPUB个人空间1`/GK&p&wY9mp E

.P]D^7\ h7V0
/P5_iN5Z2mChd0图2 新建对话框向导ITPUB个人空间#C vyxb'\'f!yDCBf

0svc s E sj8G0(3)单击“Next”按钮,选择“Hello, world”,如图3所示。
mnzp w,hqc0ITPUB个人空间,R7f3m#]9ul3n1\)S

k:p)N(u*IyKz(Cl0图3 新建插件向导
R i4X~ y-l1{ b3O4S0
#Y*fB y)ztEfx v0(4)单击“Finish”按钮,就可以创建用户想要建立的插件。ITPUB个人空间-aI\;a1sxG6H

y4K:g V c.pvA0上例中通过插件创建向导创建了“Hello,world插件”,通过Eclipse的插件创建向导还能够创建其它扩展点插件的创建。
)SPt9dm5j0ITPUB个人空间XK }2Xo9g
调试“Hello,world”插件


u%T[%bZ5x/w0通过PDE不但能创建插件,还能够调试插件。在Eclipse中调试插件的步骤如下。
8g'k amE5z"Z+@0ITPUB个人空间'lOM&hBBDBh
(1)单击“Run”→“Debug”菜单项。ITPUB个人空间!se"Wh1@ A/m

J So%wq4I.A#w0(2)在弹出的对话框窗口中用鼠标右键单击“Eclipse Application”选项。ITPUB个人空间@_ I7j&oi9Y+}
ITPUB个人空间N/@9Q1e:N
(3)单击“New”菜单项(或双击Eclipse Application树节点),创建调试插件配置参数对话框,并通过对话框设置插件的调试参数,如图4所示。
4t1g,J7g,x0fR'u#k O1H0ITPUB个人空间QU#Y6T2Rq0v2N2O

#D(_? aX0图4 Debug环境参数设置ITPUB个人空间nRSf$A~/sn`5E
ITPUB个人空间'zqb4~r T
(4)单击“Debug”按钮。ITPUB个人空间ub I-SzX|\
ITPUB个人空间Z%]"z&hV@
现在已经启动了一个调试的Eclipse,可以看到图5显示的调试窗口。调试窗口多了一个“Sample Menu”菜单项,工具栏多了一个按钮,单击菜单或按钮将会弹出 “Hello,world”对话框。
Ji"N)k _x?0
uF ?4B;cf-|0ITPUB个人空间`_6` o&e%LuC
图5 “Hello,world”插件效果图
&M&E_\5k0ITPUB个人空间nx aW7O&u
用户可以在程序中可执行到的位置设置断点,就可以和调试Java程序一样调试Eclipse插件了。
k-e%hI?2U0ITPUB个人空间9Y+Z^sc4e _
注意:如果在图4中选择Clear workspace data before lauching,表示每次调试插件时是否提示清空运行时刻的Workspace。可以选择“是”,表示重建运行时刻的Workspace。ITPUB个人空间Fz$]E4c d

H"]W:Ss%Of0插件打包

ITPUB个人空间'T&X Z{1P.}
这一步是把用户开发的插件打包,供别人使用。具体步骤如下。
2i1\9l I\-f!{4VM0ITPUB个人空间%WS0nh5\5@,lefl
(1)选择“Hello,world”插件,单击鼠标右键,选择“Export”菜单,弹出图6所示的对话框。ITPUB个人空间(Z2m e l;P x]'m.J,Q
ITPUB个人空间[}u*j*|Snn
ITPUB个人空间 gY2V"F!wn
图6 插件打包对话框
JZ3kU$s+b2^0
9f t S*FO6D0(2)输入用户想要打包的文件名。如果想把源文件也打包,可以选择“Include source code”复选框。现在“Hello,world”插件就已经成功打包了。
8M,B }*JH2i$A0ITPUB个人空间2i:Hd&_ E*C*Z"K
(3)把“Hello,world”插件解压缩拷贝到用户的Eclipse的Plugins目录下面。运行Eclipse,就可以在运行环境下看到“Hello,world”插件的身影了。ITPUB个人空间's|:K"a)NR'_i ~yM
ITPUB个人空间GE1DrK9W,Vm]
通过Export 菜单对插件进行打包,实际上Eclipse会读取插件目录下的build.properties文件,通过它来描述需要打包的内容。ITPUB个人空间5X c m8dMy

!}@cOe+Q0\0提示:不要把“Hello,World”插件拷贝到开发环境的Eclipse下面,否则插件可能不会被注册。因为开发环境的Workspace中有相同ID的插件,这样会产生冲突。要养成好习惯,把开发环境和部署环境分开。
L3W M DsWm8P6D0ITPUB个人空间F'u:AJ6RMm$n#H
插件描述文件


&f E9]r-V,Y(y0Eclipse中插件的描术文件包括Plugin.xml文件和MANIFEST.MF:
RV4@J:J0ITPUB个人空间AHFeu
l Plugin.xml:Plugin.xml描述了扩展点的基本信息,包括扩展点的实现和定义,它按照扩展点的定义文件(schema)描述扩展的信息。ITPUB个人空间K1M2Z^e+Usu

3@+Ei)d,s,x0l MANIFEST.MF:MANIFEST.MF记录了插件的状态信息,包括插件的依赖关系、运行时的类加载路径以及插件的名称等。
7Xy:Xf9E}v:`FX0ITPUB个人空间+I,m }@y8Ba*[ _
Plugin.xml主要是通过XML文件格式描述扩展点的具体内容。当Eclipse启动后,它将会找到所有插件的描述文件。当Eclipse第一次启动某一个插件时,它会从MANIFEST.MF文件读取插件的相关信息,并通过定义的插件类初始化插件。
+zh;i.\IF0ITPUB个人空间4^ BFP1G&a2aQX4k
插件描述文件编辑器窗口,如图7所示。
K&`p7Cd0ITPUB个人空间 B d fV"\q4@a;JPX
ITPUB个人空间2_0i)H`E
图7 清单文件编辑窗口ITPUB个人空间jbL#MR)^cV

E'N-l8BU UD0Manifest.MF文件中保存了插件的基本信息(和OSGI相关的信息),而Plugin.xml文件记录了扩展点的信息,这两个文件在一个编辑器中展现,分成如下几个部分。ITPUB个人空间vJ3k1N2MMb:R ~|{l,r
ITPUB个人空间~8`6a!C}z5h
l Overview:描述了插件的基本信息。
/A1{o A.y7{!W(L0
s R.uYF8P0l Dependencies:描述了插件的依赖关系。ITPUB个人空间&[:X6v/B6Me*W

n |;sP:i0l Runtime:指明运行时的ClassPath。
[AzS[^0
e+d"?3i!O D0l Extensions:指明插件实现的扩展点。
b{hu'N ^7CgSn0
d^9gbVdZ e0l Extension Points:指明插件提供的扩展点。
jjh5eJ"C:A0ITPUB个人空间#B;Em]'t3z(Is
1. OverView:描述了插件的基本信息ITPUB个人空间,KO"q a#[!p.TmK
ITPUB个人空间!LMFk$C
OverView描述了插件的基本信息,如图8所示。ITPUB个人空间5M1w/h*CV
ITPUB个人空间-M,qa1R9Vz pL
ITPUB个人空间_5o)Q-ia
图8 OverView页面
+w%T5g4hZ(N(M0
'Q$N3Aa;w Wp0l ID:ID是插件的ID号,在Eclipse中是一个具体标识。
"c yPzP-N ?^0ITPUB个人空间*O6o}9HC"T
l Version:Version指明用户所开发的插件的版本号。ITPUB个人空间K0RTU)l1In
ITPUB个人空间-jL,o/j0~%_&? L`
l Name:指用户所开发的插件的名称。
| W.V^-J4u0
f M.`0E(W4o5J#b0l Provider:开发者。ITPUB个人空间*j!^ t[fk0p`

:u]!^v2tVY0l Class:Class是指插件类,它由Eclipse建立并初始化,后面的章节将会详细介绍。
@`b] @@X"l0
"y&Mx$[za*L0l Platform. Filter:指定平台相关的一些信息,一般来说用户不需要设定。
nU%lq,@X0ITPUB个人空间S4q S A9cGA
提示:ID号在Eclipse中是一个全局的标识。很多初学者常常会对不同的插件命名成相同的ID号,这样会导致插件不能加载。ITPUB个人空间&q/Q O nxu;RXZ

6a,wP'G0f l02. Dependencies:描述了插件的依赖关系ITPUB个人空间V9?)|o(Q [a9j,K$q*d\
ITPUB个人空间P(^V0BQ m)| Vy
Dependencies页面描述了插件的依赖关系,如图9所示,插件依赖org.eclipse.ui和org.eclipse.core.runtime插件。ITPUB个人空间*d#?knX%]Z G|

M(K:D*~em.T&m6j~h\0
(yYW B pE9O0图9 Dependencies页面
F$vo&[/UaA0
"l#\ p0Su7bwYb0Dependencies是一个比较重要的概念。每一个插件有独立的ClassPath,Dependencies会把依赖的插件的ClassPath加入到当前的ClassPath中。ITPUB个人空间9ReE,G#E9ZT,I
ITPUB个人空间d f-J;t@u:pN#e
提示:插件可以调用依赖的插件中所有导出的类,但插件不能够有循环依赖,所以在设计插件的结构时一定要设计合理,切记、切记。
e'd J uq0
y.Uv,m-afI03. Runtime:指明了运行时的ClassPath
-b8W,mo-i:b:c J0
o4qJ6i:AjM:qm0Runtime:指明了运行时的ClassPath。如图10所示,jdom.jar为此插件运行时依赖的包。ITPUB个人空间X*{4R+p j}
ITPUB个人空间6^j(V"Fo&J

x_yCX/J!e{`uu0图10 Runtime页面
f2tO x\$ztP+_0ITPUB个人空间8p&N-^+Mkw AM
在Exported packages中也加入了一些要导出的包,如果不导出这些包,其它依赖当前插件的插件就用不了当前插件中对应包下的类。
:Bl4^#H(Wj8jv0ITPUB个人空间r0j\g3Uy F
Runtime也是一个比较重要的概念,它指明了运行时的环境。Eclipse中插件不会引用到系统的ClassPath,每一个插件都有独立的ClassPath。ITPUB个人空间*K-?HFx ?2OrK

#v,H&VA({x;Zg0提示:很多人在开发插件时,没有通过Runtime指明ClassPath,而是直接添加Jar包,这样,在编译期间可能不会出错,但是在插件运行时会提示类找不到(ClassNotFoundException),就是这个问题。ITPUB个人空间v,`m8d+r7tY

6e9XV)|e;]j r04. Extensions:指明插件实现的扩展点ITPUB个人空间$p$rd4j*R*tw/zF
ITPUB个人空间un6Fw4c0nq
Extensions:指明插件实现的扩展点。例如插件要实现“org.eclipse.ui.actionSets”扩展点,如图11所示。ITPUB个人空间0uHQl n m,G

"E'P^c#m\^p'y0ITPUB个人空间F{TjZ_l
图11 Extensions页面
uq(]pn6axC0ITPUB个人空间)v V0o@?9yS
Extensions是用户在开发一个插件中用到的扩展点,也是Eclipse开发的精髓所在。后面章节的主要工作就是围绕扩展点展开的。下面为扩展点在Plugin.xml文件中定义的片段。ITPUB个人空间ih8e%{+yE

[E}BE7Q0<!-- 实现的扩展点 -->
8a+rtlL.k,@3q0ITPUB个人空间Hq8Z[z7sA,C
<extension
H4B HP2LL4?Z8[0
f!h/u1r]n9u"} f2ja0point="org.eclipse.ui.actionSets">
+t:P%O Pw0
$H KJ4kg0<actionSetITPUB个人空间:| {"RZCJ
ITPUB个人空间`7_ t2NJ.l-a
label="Sample Action Set"ITPUB个人空间M-D5jU:~r#QT
ITPUB个人空间9lf!J5@F5|(Dn[3{
visible="true"
B%K"X9w p \,OX0
v Disg0id="com.test.helloworld.actionSet">
oq9\ IVe2D g+W!m0ITPUB个人空间6Y-W}o w(I|m
<menuITPUB个人空间(A!CF#W{.L!sW

(Z&zl"h o ]*y0label="Sample &amp;Menu"
5c}iv$L9M"Y @/n0g0
j3l["X.u#s%J0id="sampleMenu">
8`o/Hx`/GS0ITPUB个人空间i~5? \A~r^
<separator
_h7G9|+OWq Gg0ITPUB个人空间'~3R0T D&@5LhX
name="sampleGroup">
I9^ Q2Nc%r k%n }9qq g0
;S7EFvh as{4z@0</separator>
rcQQ"?n3kP%W0
.T(m9^(TEmP/k0</menu>ITPUB个人空间rU] RQUQI
ITPUB个人空间 }g0Sr7n;u Nm
<actionITPUB个人空间o7My"s F*Np3@

D(Br.cTv0label="&amp;Sample Action"ITPUB个人空间oNK'bZO8_*s)U(c#`

)Z"Ry/xB-MqyP5_0icon="icons/sample.gif"ITPUB个人空间br|g{g,a
ITPUB个人空间1_s1j(Yy
<!-- 扩展点的实现类 -->
N4dIUM(a\ `5{.d0
"g~!Ce*c;ze%J0class="com.test.helloworld.actions.SampleAction"ITPUB个人空间 O'vh7C]+X)ZePT

^Og7MN#~L0tooltip="Hello, Eclipse world"ITPUB个人空间!e6^-^k,P wM

Pn*^I O)i0^Zg#n~fQ ]0menubarPath="sampleMenu/sampleGroup"
3u_&f6zW\b0ITPUB个人空间 ?Y3c4ZGM7?
toolbarPath="sampleGroup"ITPUB个人空间Dy"[ Nt
ITPUB个人空间k1e7gV'L+E2Z$CM
id="com.test.helloworld.actions.SampleAction">
Tyz1ppy`0
;YM1{L|4]&J0R0</action>ITPUB个人空间gJ0QO"t'q

%P2WC"er|}:Sj(M0</actionSet>ITPUB个人空间;Bl@5VFs2^C
ITPUB个人空间1co'do zK9q
</extension>ITPUB个人空间@7I]2I"M5NT;L&}

r'I$? as7T RW~05. Extension Points:指明了用户插件提供的扩展点ITPUB个人空间1^s n"U5Pv7F o

)^F|&RFty2f;[O0Extension Points:指明了用户插件提供的扩展点。如图12所示,此处为UI插件所提供的扩展点。ITPUB个人空间u&j9^ rD&ZKb:r

"fq{^|,v-dtg@y0ITPUB个人空间+o%w&F!@A]Vu
图12 插件提供扩展点ITPUB个人空间-dqb:tR+k9@

6fE+K|#t*L.^0Eclipse的强大功能就是提供插件的扩展机制,用户可以实现他人提供的扩展点,也可以通过“Extension Points”为他人提供扩展点。ITPUB个人空间f:y0rqR;m6k B'r
ITPUB个人空间?f A0Di7r
提示:实现扩展点和提供的扩展点是两个不同的概念。实现扩展点是利用其他插件提供的扩展点,实现用户想要完成的功能。提供的扩展点是为其他插件提供扩展所需要的接口。
crq9S(fU-z.v*}U0


image016

image016

TAG:

引用 删除 Guest   /   2008-07-25 09:32:00
5
引用 删除 yhs8983   /   2008-07-04 13:49:27
最近正在学着做插件开发,这个不错,收藏了!
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2009-07-04  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 21553
  • 日志数: 43
  • 文件数: 11
  • 建立时间: 2008-02-14
  • 更新时间: 2008-09-05

RSS订阅

Open Toolbar