郑重声明:本文是个人的笔记,不一定适用阁下,不过并不介意你阅读。
我一直对Eclipse的架构很感兴趣,很想知道它怎样利用OSGI框架来加载和管理各个插件(OSGI称为Bundle),听起来实现的过程不简单,但我还是决定记录一下其中的细节,所以如果我有什么理解不正确的地方,请提醒我。
Eclipse提供了一个本地可运行方式来启动Eclipse平台,它包含两部分:可执行程序(eclipse.exe)和一个共享DLL文件(eclipse_1115.dll); eclipse.exe文件位于eclipse的安装目录下,而那个dll文件位于安装目录的plugins文件下的org.eclipse.equinox.launcher.win32.win32.x86_1.0.101.* 文件夹下面.
在Eclipse3.3以前的版本,Eclipse安装目录下都有一个startup.jar的文件,eclipse.exe通过执行这个jar文件来启动Eclipse平台,在Eclipse 3.3及以后的版本对此进行了重构,startup.jar文件的功能被"org.eclipse.equinox.launcher .*" 这个插件替代了,你也可以通过Java的jar命令启动Eclipse平台:比如启动Eclipse 3.4.2: java -jar plugins/org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar
首先Eclipse先查找JVM,然后使用JNI并加载和启动JVM, 如果你在命令行参数中没有指定 "-vm" 参数,Eclipse会先从安装目录下找jvm的文件夹,如果发现有这样一个文件夹,会在文件夹下搜索“jvm.dll"文件,如果找到这个文件,Eclipse将加载并启动JVM,如果没有找到,会根据环境变量中指定的位置查找JVM,你也可以在命令行添加"-vm"参数或者安装目录下面的configuration文件夹下面的config.ini文件中指定特定的JVM的位置。
在找到JVM并启动后,开始执行org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar,这个jar文件中指定了运行的主类:org.eclipse.equinox.launcher.Main,这个类负责初始化Eclipse的运行环境,包括设置必要的系统属性、解析和处理configuration/config.ini配置文件、加载OSGI框架的Jar文件、检查Java版本是否符合Eclipse最低运行要求、设置安全级别、显示启动的闪屏界面、最后通过加载"org.eclipse.core.runtime.adaptor.EclipseStarter.class"并调用它的run(String[], Runnable)方法来启动Eclipse平台.
EclipseStarter 位于org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar这个插件中,这个类不能被子类继承,也不应该被显式实例化,这个类中提供的方法都是静态方法。在这个类主要通过run(String[], Runnable)完成了Eclipse平台的启动,而在这个方法块中的startup(String[], Runnable)负责初始化属性和配置、注入系统钩子(Hook)、创建OSGI框架 、注册插件(Bundle)事件、加载基础的插件、运行OSGI框架等一系列操作启动Eclipse平台。在startup方法执行完成后开始执行run(Object),在这个方法中会创建EclipseAppLauncher的实例并将其注册到OSGI的服务系统中,接着调用EclipseAppLauncher的start方法启动,读取插件扩展点信息,查找声明了"org.eclipse.core.runtime.applications"扩展点的实现类,调用它的Run方法就开始启动,这基本上就是Eclipse平台的基本操作。下面是RCP程序的类调用层次:
如果你已经阅读到这里,说明你确实很感兴趣,想要通过文字来描述代码,很不容易,我建议你还是去阅读一下上面提到的那两个类:org.eclipse.equinox.launcher.Main和org.eclipse.core.runtime.adaptor.EclipseStarter,它们的确设计的很精彩,很有学习的价值。