Eclipse 启动,从EclipseStarter开始

郑重声明:本文是个人的笔记,不一定适用阁下,不过并不介意你阅读。

    我一直对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 程序的类调用层次:

http://www.blogjava.net/images/blogjava_net/vwpolo/eclipsestarter-intro/rcp-callhierarchy.jpg

   如果你已经阅读到这里,说明你确实很感兴趣, 想要通过文字来描述代码,很不容易,我建议你还是去阅读一下上面提到的那两个类: org.eclipse.equinox.launcher.Mai n org.eclipse.core.runtime.adaptor.EclipseStarter 它们的确设计的很精彩 ,很有学习的价值。

猜你喜欢

转载自marsvaadin.iteye.com/blog/1025383