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

上一篇 / 下一篇  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 a WI
开发“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个人空间+L7PH1X&^ a'i ]N
下面是创建一个简单插件的操作步骤。
"M3bG]'f/~*uW0
0K?3R y#@)?G0(1)运行Eclipse。ITPUB个人空间+eF.[&I8^

3o(h{0TA E0单击Eclipse的“File”→“New”→“Other”菜单项,在弹出的对话框中选择Select对话框左边的Plug-in Development向导。如图1所示,选择Plug-in Project。
YSeq,?U2P4USJ6dj0
so`-b-C_ R0ITPUB个人空间ai id-`6c#oO h
图1 新建插件对话框
,o$Z!xt CISn0
X y Ut6h*iPH0(2)单击“Next”按钮,弹出新建对话框,输入项目名称。此处使用了“com.test.helloworld”。单击“Next”按钮后弹出新建对话框页,如图2所示,插件标识就与项目名称相同。使用项目名称作为插件标识可以将该插件与另一个插件的名称发生冲突的机会减到最小。
$N8o!O$plvlr0
%b W'd*AG%\#P7jP0ITPUB个人空间$k? F|x+m!z@ Z
图2 新建对话框向导ITPUB个人空间}i x#\#i(A8S1S^
ITPUB个人空间U7wW'^kfD`-rJ
(3)单击“Next”按钮,选择“Hello, world”,如图3所示。ITPUB个人空间(vp)t)[h:? z

'mj&f4^sP0ITPUB个人空间"k5p _5boQ dv
图3 新建插件向导ITPUB个人空间 K2~-G5^1@8h\!E

r%zXm&|A @&l0}_,H0(4)单击“Finish”按钮,就可以创建用户想要建立的插件。
~-r3w-P b0ITPUB个人空间T@BG,LN:j Q
上例中通过插件创建向导创建了“Hello,world插件”,通过Eclipse的插件创建向导还能够创建其它扩展点插件的创建。ITPUB个人空间c3_H'{)v
ITPUB个人空间t/f3S x1F!Y}1}
调试“Hello,world”插件


2\$f#F.FS i0通过PDE不但能创建插件,还能够调试插件。在Eclipse中调试插件的步骤如下。
*F,d sV#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
k Vr-^g~w0(3)单击“New”菜单项(或双击Eclipse Application树节点),创建调试插件配置参数对话框,并通过对话框设置插件的调试参数,如图4所示。ITPUB个人空间x7ly&y6|z9d(_`
ITPUB个人空间9Zf+[4r\6E n }
ITPUB个人空间UmA 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 Ookz0ITPUB个人空间.`](GMPb0Xh`
ITPUB个人空间8R'}9O2^*d!S j
图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个人空间#J B}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个人空间Vmes6r['OHIOa
ITPUB个人空间8Xk/`6r'@LS&x
(2)输入用户想要打包的文件名。如果想把源文件也打包,可以选择“Include source code”复选框。现在“Hello,world”插件就已经成功打包了。
5L*`B.?#B b&U0A0
*k`9o b!{1z/s$v0(3)把“Hello,world”插件解压缩拷贝到用户的Eclipse的Plugins目录下面。运行Eclipse,就可以在运行环境下看到“Hello,world”插件的身影了。ITPUB个人空间&PHbI-R f$nI"DqL0f

(j6O qq#v0通过Export 菜单对插件进行打包,实际上Eclipse会读取插件目录下的build.properties文件,通过它来描述需要打包的内容。
OhmrS_)t3n0ITPUB个人空间UP%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-ue0
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#n h m0l Dependencies:描述了插件的依赖关系。ITPUB个人空间,Bsc ~+q]K;S

x.j8HY s!opQVR0l Runtime:指明运行时的ClassPath。ITPUB个人空间.F9_oi.C0Z
ITPUB个人空间!x T0B/E,G"?fS
l Extensions:指明插件实现的扩展点。
&vPZGS0A}|0ITPUB个人空间 k7Ia%u2?JsW!Du
l Extension Points:指明插件提供的扩展点。
z0_.TqGVs0ITPUB个人空间qi0S2[nk1Aj e2n]a
1. OverView:描述了插件的基本信息
C za;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

1a k-utG|0l Version:Version指明用户所开发的插件的版本号。ITPUB个人空间#b6v G_&E_
ITPUB个人空间 ~g A.{1g:FPRd6~9t(@
l Name:指用户所开发的插件的名称。ITPUB个人空间j)Dj8a9JJGG.d

~"Pt] h B0l Provider:开发者。
$Ri'E&H4q+w-}3E0
^Bm/]^kn0l Class:Class是指插件类,它由Eclipse建立并初始化,后面的章节将会详细介绍。
np;G&_&s k:AM0
Rh8B*iVf)~0l Platform. Filter:指定平台相关的一些信息,一般来说用户不需要设定。ITPUB个人空间0Q3P;zWA9IQ I;O

.lp Y#x4uz1v5Jq-`V|%n0提示:ID号在Eclipse中是一个全局的标识。很多初学者常常会对不同的插件命名成相同的ID号,这样会导致插件不能加载。
u3xs)jq0CY[0ITPUB个人空间(QM w&U5t!K
2. Dependencies:描述了插件的依赖关系
_1bU u)k.dO'u2O]zd0ITPUB个人空间&N7P qV q*y
Dependencies页面描述了插件的依赖关系,如图9所示,插件依赖org.eclipse.ui和org.eclipse.core.runtime插件。ITPUB个人空间4br$] bZ

*c'K;}(B5s\v0
Q*OU+T p5R&| ao0图9 Dependencies页面ITPUB个人空间z1]q,d*MYa

xXV b~1FQ/o0Dependencies是一个比较重要的概念。每一个插件有独立的ClassPath,Dependencies会把依赖的插件的ClassPath加入到当前的ClassPath中。ITPUB个人空间SEk:[!vV9R

6T v+q#C&p4L;^*H8D0提示:插件可以调用依赖的插件中所有导出的类,但插件不能够有循环依赖,所以在设计插件的结构时一定要设计合理,切记、切记。
:oni.HB[0
8a0B9J n({ A03. Runtime:指明了运行时的ClassPathITPUB个人空间H4B1{x9[4~+~ {I

V$r(rAX9F"k)r0Runtime:指明了运行时的ClassPath。如图10所示,jdom.jar为此插件运行时依赖的包。
)mC5So/S+X/ja OU0ITPUB个人空间%`1P^fB6zg
ITPUB个人空间X lIXR V.K;_m
图10 Runtime页面ITPUB个人空间D\ yB vVRi;n
ITPUB个人空间EZ7q m!@ H:T
在Exported packages中也加入了一些要导出的包,如果不导出这些包,其它依赖当前插件的插件就用不了当前插件中对应包下的类。ITPUB个人空间0{n*|#{H%_Xs"r
ITPUB个人空间}*N-yf&o&Z
Runtime也是一个比较重要的概念,它指明了运行时的环境。Eclipse中插件不会引用到系统的ClassPath,每一个插件都有独立的ClassPath。ITPUB个人空间U;o$v2RJ;v%u

o K yZ)Er%F1J*b0提示:很多人在开发插件时,没有通过Runtime指明ClassPath,而是直接添加Jar包,这样,在编译期间可能不会出错,但是在插件运行时会提示类找不到(ClassNotFoundException),就是这个问题。ITPUB个人空间 nD7z(\&Xka(G
ITPUB个人空间*A Yr]O0F
4. Extensions:指明插件实现的扩展点ITPUB个人空间FY$L!WkB
ITPUB个人空间2c?H&Z e#L)o!^&},]
Extensions:指明插件实现的扩展点。例如插件要实现“org.eclipse.ui.actionSets”扩展点,如图11所示。
K)m,tP |s0
Mj"z]TdW(k}(r E0ITPUB个人空间(QqcL4wB PS#o
图11 Extensions页面
q l!N6S(NV[Ff3n1c`0
Il R aUj|;d0Extensions是用户在开发一个插件中用到的扩展点,也是Eclipse开发的精髓所在。后面章节的主要工作就是围绕扩展点展开的。下面为扩展点在Plugin.xml文件中定义的片段。
Od]B\7D~0ITPUB个人空间s [8h W6Dg7p
<!-- 实现的扩展点 -->
5x f$j'jSW5oB6TD0
#n&~\+r&S/Y7W0<extension
.T WC*n*_'j9i/`[0ITPUB个人空间m bG I0fb)K1v
point="org.eclipse.ui.actionSets">ITPUB个人空间2glN`y3mD }
ITPUB个人空间 e mR0N/u7j
<actionSetITPUB个人空间)f#s&E\F.o5`

Chs ~&U0label="Sample Action Set"
s%VV cW$[q6`s0
D4\4NFB&f$Q2P!d:K5m0visible="true"ITPUB个人空间5etL fr j?M&^@X

j0e'q&rWMTi0id="com.test.helloworld.actionSet">ITPUB个人空间"@7XC/dR\{t$o p

7m)z/}~ZT3t0<menuITPUB个人空间7}$y'n/aD1e1O]/KHuP

[/BcE ?YUT*M4d*S0label="Sample &amp;Menu"
6tV5b~a6p9W"p0s1R0
7Q/?X w$Ns7px0id="sampleMenu">ITPUB个人空间j'L lH\W9t-iRH
ITPUB个人空间 U*S4s0@ s4KaK
<separatorITPUB个人空间E/`pA\(G`hcd;o
ITPUB个人空间*Y2b.m&e3]\ hw@Ce1N
name="sampleGroup">
-Wm'{.o(k4f&tSS0
F6Jz1_6Y*k&wb9Q0</separator>
D&FV` Lw7uisr0
"wgL`If;n]_ ]7jK0</menu>ITPUB个人空间:?k^.A H'^5f

e+x#G8IS|qF9J0<action
-R smd8yx`0
n+pv H h!? HW0label="&amp;Sample Action"
%T1cX{i ~0MMo0ITPUB个人空间x||5~'b]1G/|,B#aDG
icon="icons/sample.gif"ITPUB个人空间 })k T2O.\oT4LV

%^?,U4y%p}Zf|0<!-- 扩展点的实现类 -->
m Q7\M6`\:RMC0
5tol!ixG/[1{G0class="com.test.helloworld.actions.SampleAction"ITPUB个人空间z$X\I1zY
ITPUB个人空间(YZB4Sph B
tooltip="Hello, Eclipse world"ITPUB个人空间!^ \B7Y*_
ITPUB个人空间2v+J4L/w6MU&Zv;z
menubarPath="sampleMenu/sampleGroup"ITPUB个人空间'Zsx/j n1f1LZ

j^ Qbf7{1no(Z0toolbarPath="sampleGroup"ITPUB个人空间&t0\a|Z#J
ITPUB个人空间6QOn T,y*w @l
id="com.test.helloworld.actions.SampleAction">ITPUB个人空间P Mm h*k+} MGz-d+e
ITPUB个人空间o1@c)B#r9? ^
</action>ITPUB个人空间!n6P%v(jEK_^A S
ITPUB个人空间;pnJ Op9Q{X
</actionSet>ITPUB个人空间B8w;eI.w@
ITPUB个人空间"lT.z!G w*S ?7z
</extension>ITPUB个人空间R/MM[A:me

+?;z#a'S| a)e05. Extension Points:指明了用户插件提供的扩展点
/W kVp$u-p8~1`0
m$T'v5N9L|B5Zz'K0Extension Points:指明了用户插件提供的扩展点。如图12所示,此处为UI插件所提供的扩展点。
"@ v&K]9A7V(Z0
8I_\,R!d$la_0
7w6Bclwz!p5Oq0图12 插件提供扩展点
UM Pf-c D/c0
mD/Vrw&l0Eclipse的强大功能就是提供插件的扩展机制,用户可以实现他人提供的扩展点,也可以通过“Extension Points”为他人提供扩展点。ITPUB个人空间iYH!L"|QU/q9[

;|+M R*MJ-i,[0提示:实现扩展点和提供的扩展点是两个不同的概念。实现扩展点是利用其他插件提供的扩展点,实现用户想要完成的功能。提供的扩展点是为其他插件提供扩展所需要的接口。
7u.@x5J h0


image016

image016

TAG:

引用 删除 Guest   /   2009-11-18 15:24:33
5
引用 删除 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 :( :)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

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

RSS订阅

Open Toolbar