Eclipse的启动过程

Eclipse探秘-第一章-Eclipse启动(2)-org.eclipse.equinox.launcher

这个包的Main Classorg.eclipse.core.launcher.Main.main,在3.0版本前,一直是通过startup.jar包中这个类里启动Eclipse3.0版本后采用了OSGi框架,OSGi的框架中Eclipse的实现是equinox项目,在3.0版本后,原来的startup.jar合并到了equinoxlauncher包中。
org.eclipse.core.launcher.Main.main
调用的是org.eclipse.equinox.launcher.Main.main(args)org.eclipse.equinox.launcher.Main.main方法调用Main类自身的run方法,run方法结果如下
1.
启动,调用basicRun方法,启动UI界面
2.UI
界面关闭后,执行setExitData方法。setExitData方法通过JNIBirdge调用保存数据。
run
方法使用了Throwable捕捉异常,这样能捕捉JVM所能捕捉的异常,这是平台常用的捕捉异常方式,避免程序崩溃。在崩溃时,Eclipse通过捕捉这个异常给出提示(就是那个对话框,Eclipse不见了)。

run方法调用的是basicRunEclipse的主要启动函数,它的主要内容包括:
1.
记录启动启动时间,通过debug模式可以看到Eclipse的启动时间
2.processCommandLine
:处理Command参数,并根据Command参数设置默认属性
3.setupVMProperties
:将VM参数写入到System.Properties
4.processConfiguration
:加载配置信息
5.getInstallLocation:
获取安装路径
6.getBootPath
:获取启动路径列表
7.setupJNI
:启动JNIBridge,加载dll类库
8.
检查JDK版本、检查配置信息
9.setSecurityPolicy
:设置安全策略
10.handleSplash
:启动闪屏
11.invokeFramework
:加载框架

下面对重点方法进行描述:
1.processConfiguration
:处理配置信息
如果在启动时没有指定-configuration参数,将会以当前安装目录和默认的配置文件夹configuration加载配置信息,默认加载目录下的config.ini文件,以properties读入,将配置信息合并到System.getProperties()中。在config.iniosgi.framework的指定的Jar包进行启动。
2.getInstallLocation()
:获取当前安装路径。它先从系统配置信息中获取安装路径,如果没有,则通过获取main类包的路径换算出安装路径(Main.class.getProtectionDomain().getCodeSource().getLocation())方式获取。
3.getBootPath
:获取启动路径列表,读取osgi.frameworkosgi.framework.extensions(逗号分割)
4.setupJNI
:首先获取--launcher.library的路径,并根据操作系统、架构、窗体架构等信息,加载相应的本地文件(例如:dllso)。并使用Runtime.getRuntime().load(lib)加载本地文件。
5.setSecurityPolicy
方法:对OSGi框架设置全部权限。
6.handleSplash
:加载闪屏
7.invokeFramework
:启动OSGi框架。设置OSGi框架的ClassLoader,如果没有指定ClassLoader,默认将boot设置为OSGi框架的ClassLoader的父类,并产生一个Equinox框架的StartupClassLoader,在启动路径列表里加载相应的类,通过该ClassLoader加载org.eclipse.core.runtime.adaptor.EclipseStarter类,并调用其run方法,将命令行参数及闪屏对象(线程)传递给run方法。

至此Eclipse的启动包中方法结束,下一节将将启动类org.eclipse.core.runtime.adaptor.EclipseStarterrun方法。

2013.12.25 http://bbs.csdn.net/topics/300235814

接下来要说的就是EclipseStarter类的运行情况了,它位于OSGI的那个plugin(注:D:\Program

Files\eclipse\plugins\org.eclipse.osgi_3.2.2.R32x_v20070118.jar)中。对OSGI,要学习Eclipse一定要学习OSGI(可以从http://www.osgi.org/查找到相关的资料)。简单来说OSGI本来是用于设备上软件的一个开发框架,在eclipse3.1中被用来作为系统的模块化框架,eclipse有个专门的项目equinox专门用来实现osgi框架,也被成为systembundle,而所有其它的作为一个bundle被systembundle来管理。

 

    EclipseStarter的作用就把osgi的启动类,它是通过configuration目录下的config.ini来进行配置的。它的第一步主要实例化了org.eclipse.osgi.baseadaptor.BaseAdaptor和 org.eclipse.osgi.framework.internal.core.OSGi并启动,你们会看到configuration生成org.eclipse.osgi目录放置相关的bundle信息,在eclipse启动的-clean参数也就是清理这个目录。Osgi所做的工作是把equinox、runtime、update等基本的bundle定位、加载进来。

 

   EclipseStarter一切就绪后就要启动ide了,它是通过org.eclipse.core.runtime.internal.adaptor. EclipseStarter启动起来的。说道这里又要说osgi,实际上这里不是直接、也不是reflection启动的,而是不同osgi的ServiceRigistry获得后实例化后启动的(也就是在上一步load runtime bundle的时候注册上的服务)。

   

    下一步就要转战org.eclipse.core.internal.runtime.PlatformActivator了,它的作用要说也简单,把所有注册过的applications级的IExtension启动起来,这里就又主要转到 org.eclipse.ui.ide_3.2.1.M20060915-1030.jar中的 org.eclipse.ui.internal.ide. IDEApplication,一直到这里从开始启动我们的ide。

   

     从以上过程也可以看出,eclipse就是通过启动类把osgi框架启动起来作为内核也就是systembundle,再进行其它bundle的加载,和 jboss通过启动类启动jmx微内核再加载各种MBean的机制是类似的,这也就导致如果对eclipse整体没有一个很好的了解,学习梯度还是比较大的,经常看着看着只见树木不见森林了。

猜你喜欢

转载自sdfx.iteye.com/blog/1941660