Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture)

概述
Eclipse中最出彩的部分莫过于它的Plugin Framework,可以说Eclipse在一定程度上使得Plugin机制得以流行,当然,Eclipse的优势不仅仅在此,但正因为采用了Plugin机制,Eclipse才得以被不断的扩充,越来越强大。一直以来就想分析Eclipse的Plugin Framework,由于各种原因一直耽搁,刚好这个周末没什么事,下定决心对其进行了研究和分析,方法很原始,就是对Eclipse的启动过程进行分析,基于的是Eclipse 3.1的版本,分析过程就不在这说了,主要是说说分析出来的心得。
架构上来讲Eclipse基本采用的是Kernel+Core Plugins+Custom Plugins的结构体系,除了Kernel部分外均为Plugin,所以可称为all are plugins,凡是Plugin的部分都是可被替换的。

OSGI
Eclipse 3.0后采用的是OSGI来作为其Plugin Architecture实现的依据,鉴于此就得简单提提OSGI了,主要从Plugin的角度来分析OSGI,OSGI概念中主要分为了Bundle和Service,可以认为Bundle是一个模块的管理器,主要是通过BundleActivator管理模块的生命周期,而Service则是这个模块可暴露对外的服务对象,这里体现了OSGI和传统的Plugin Framework不同的一个地方,管理和静态结构分开,在OSGI中通过在manifest.mf文件中增加一些内容来发布Bundle,在其中描述了Bundle的提供商、版本、唯一ID、classpath、暴露对外的包、所依赖的包;每个Bundle拥有自己的ClassLoader以及context,通过context可进行服务的注册、卸载等,这些操作都会通过事件机制广播给相应的其他的Bundle;一般来说都为通过在Bundle中编写初始需要注册的服务的方法来完成Bundle可供外部使用的服务的暴露功能;如需要调用其他Plugin提供的服务可通过context的getServiceReference先获取Service的句柄,再通过context.getService(ServiceReference)的方法获取Service的实体。

Eclipse Plugin定义
Eclipse中的Plugin的概念为包含一系列服务的模块即为一个Plugin。既然是遵循OSGI的,也就意味着Plugin通常是由Bundle和N多Service共同构成的,在此基础上Eclipse认为Plugin之间通常存在两种关系,一种为依赖,一种为扩展,对于依赖可通过OSGI中元描述信息里添加需要引用的Plugin即可实现,但扩展在OSGI中是没有定义的,Eclipse采用了一个Extension Point的方式来实现Plugin的扩展功能。
结合OSGI
Eclipse遵循OSGI对于Plugin的ID、版本、提供商、classpath、所依赖的plugin以及可暴露对外的包均在manifest.mf文件中定义。
Plugin Extension Point
对于扩展,Eclipse采用Extension Point的方式来实现,每个Plugin可定义自己的Extension Point,同时也可实现其他Plugin的Extension Point,由于这个在OSGI中是未定义的,在Eclipse中仍然通过在plugin.xml中进行描述,描述的方法为通过<extension-point id="" name="" schema="">的形式来定义Plugin的扩展点,通过<extension point="">的形式来定义实现的其他Plugin的扩展点,所提供的扩展点通过schema的方式进行描述,详细见eclipse extension-point schema规范,为了更好的说明扩展点这个概念,举例如下,如工具栏就是工具栏Plugin提供的一个扩展点,其他的Plugin可通过此扩展点添加按钮至工具栏中,并可相应的添加按钮所对应的事件(当然,此事件必须实现工具栏Plugin此扩展点所要求的接口),工具栏的Plugin将通过callback的方式来相应的响应按钮的动作。可见通过Extension Point的方式可以很好的提供Plugin的扩展方式以及实现扩展的方式。

Eclipse Plugin Framework
那么Eclipse是如何做到Plugin机制的实现的呢??还是先讲讲Eclipse的设计风格,Eclipse在设计时有个重要的分层法则,即语言层相关和语言层无关的代码分开(如jdt.core和core),核心与UI分开(如workbench.ui和workbench.core)这两个分层法则,这个在Eclipse代码中处处可见,在Plugin Framework部分也充分得体现了这个,遵循OSGI,Eclipse首先是实现了一个OSGI Impl,这个主要通过它的FrameWork、BundleHost、ServiceRegistry、BundleContextImpl等对象来实现,如果关心的话大家可以看看这部分的代码,实现了Bundle的安装、触发、卸载以及Service的注册、卸载、调用,在Plugin机制上Eclipse采用的为lazy load的方式,即在调用时才进行实际的启动,采用的为句柄/实体的方式来实现,外部则通过OSGI进行启动、停止等动作,各Plugin则通过BundleContext来进行服务的注册、卸载和调用,这是OSGI的部分实现的简单介绍。
那么Extension Point方面Eclipse是如何实现的呢,在加载Plugin时,Eclipse通过对plugin.xml的解析获取其中的<extension-point>节点和<extension>节点,并相应的注册到ExtensionRegistry中,而各个提供扩展点的Plugin在提供扩展点的地方进行处理,如工具栏Plugin提供了工具栏的扩展点,那么在构成工具栏时Plugin将通过Platform.getPluginRegistry().getExtensionPoint(扩展点ID)的方法获取所有实现此扩展点的集合IExtensionPoint[],通过此集合可获取IConfigurationElement[],而通过这个就可以获取<extension point="">其中的配置,同时还可通过IConfigurationElement创建回调对象的实例,通过这样的方法Eclipse也就实现了对于Plugin的扩展以及扩展的功能的回调。在Plugin Framework中还涉及很多事件机制的使用,比如Framework的事件机制,以便在Bundle注册、Service注册的时候进行通知。

总结
通过对Eclipse启动过程的分析,可清晰的看到Eclipse Kernel+Core Plugins+Application Plugins的方式,在代码中分别对应为loadBasicBundles和registerApplicationServices,loadBasicBundles通过加载config.ini中的osgi.bundles完成基本的bundles的加载,去看看这个配置会发现是org.eclipse.core.runtime还有一个update,core.runtime又会通过IDEApplication来完成整个Eclipse的启动,同时会注册所有与workbench相关的plugin。
Eclipse由于以前版本的Plugin Framework是没有采用OSGI的,所以通过EclipseAdaptor的方式来实现与以往的兼容,目前新的Plugin采用的方式基本就是manifest.mf描述Plugin OSGI部分的信息,Plugin.xml描述扩展点的信息。
Eclipse中有非常多优秀的设计,这个在看它的代码时会有很深的感触,比如Contributing to Eclipse中提到的Extension Object/Interface的设计,确实是非常的不错,虽然看到你可能觉得很简单,关键是要想得到并合适的去使用。
总结陈词,^_^,Eclipse Plugin Framework是采用OSGI Impl+Plugin Extension-Point的方式来共同实现的,实现了Plugin的部署、编写、独立的Classloader和Context、Plugin中Service的注册、Plugin中Service的调用、Plugin的依赖、Plugin的扩展、Plugin生命周期的管理。

带来的思考
Eclipse Plugin Framework采用的是OSGI的实现,一定程度上我们也能看到OSGI的优点,那么JMX+IoC方式的Plugin Framework与其的比较又是在哪些方面呢?Eclipse Plugin Framework不足的地方又在哪里呢?哪些地方值得改进呢?

 

posted on 2005-07-03 21:57 BlueDavy 阅读(9724) 评论(15)  编辑  收藏 所属分类: Plugin Architecture

评论

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-08-10 16:00 hopeshared

你好!我最近在做Eclipse插件,对自定义插件的那部分非常头疼,不知道应该怎么设计,怎么实现。你有例子或者资料能推荐给我吗?
谢谢!邮箱 hopeshared@tom.com  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-08-10 19:33 Programmer's Life

请参考Contributing to Eclipse的例子  回复  更多评论   

# 请同仁指教,务必! 2005-09-12 16:07 李健

我看contributing to eclipse 在完成第一循环的时候,总是有问题,找不到
<action
label="Run Test"
class="org.eclipse.contribution.junit.RunTestAction"
enablesFor="1"
id="org.eclipse.contribution.junit.runtest.action">

里面的那个类,如果我将
<plugin
id="org.eclipse.contribution.junit"
name="JUnit Plug-in"
version="1.0.0"
provider-name=""
class="org.eclipse.contribution.junit.JUnitPlugin">
这段中的class一行去掉就可以找到,(当然报错)  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-09-29 17:16 solouton@hotmail.com

在没有使用osgi的时候就看过eclipse的部分源码,对其机制深有感触, 核心与osgi结合后 有更进一步 尤其是对rcp应用,可惜国内软件巨头 似乎兴趣不大,其实免费午餐 也有好的  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2005-12-15 17:30 weide

几个月前就读过,再次读还是大受启发。

尤其最后“带来的思考”更是我现在感到困惑的。JBoss会考虑把JMX换成osgi?  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-15 16:41 ezysky

感觉还有进行了研究,不过,eclipse的plug-in原理容易理解。不过让我写eclipse本身,感觉还是太困难了;而写一个完整的plugin同样还是不易,比如CDT就有近20万行的代码,并且感觉CDT把plugin复杂化了。  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-15 20:12 BlueDavy

^_^,那是因为它是一个扩充了的eclipse的plugin机制  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-16 10:38 ezysky

@BlueDavy
我不认为CDT是扩充了的eclipse的plugin机制,CDT的原理也很简单,也就是一个core+两个基于core的扩展plugin,层层递进。毕竟是那么多人做了几年的心血,又是IBM主导,不好也难!  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-16 10:43 BlueDavy

^_^,同意
CDT必然是遵守eclipse的plugin机制.......我的意思是eclipse的plugin机制是有扩展的,eclipse的plugin机制是基于OSGI的,但它基于它之上提出了一些提升plugin体系的改进。  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-02-16 11:02 ezysky

@BlueDavy
呵呵,这点严重同意!  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-09-07 17:41 weidagang2046

希望能出一篇文章讲讲分析过程。  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-09-28 11:51 jackgogogo

@weidagang2046
I am agree with u.  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2006-10-29 22:09 eclipsefan

不错啊,也顺便推荐一个eclipse插件站点。

http://www.eclipsepowered.net/  回复  更多评论   

# 请教怎样看Eclipse 的Plugin部分的源码 2007-05-26 23:53 XGANG

您好,我最近想看看Eclipse 的Plugin部分的源码,但不知该怎么去看,比如从哪一个地方开始,怎么单步执行等还不了解,希望您能教教我。您在文章中说就是就是“对Eclipse的启动过程进行分析”,我想请教一下怎么才能跟踪启动过程。谢谢了  回复  更多评论   

# re: Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) 2010-03-13 13:09 cool

牛啊 借鉴下可以不 嘻嘻  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

 









feedsky
抓虾
google reader
鲜果

导航

<2005年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

随笔分类

随笔档案

文章档案

Blogger's

搜索

最新评论

阅读排行榜

评论排行榜