Eclipse探秘-第一章-Eclipse启动(2)-org.eclipse.equinox.launcher
这个包的Main Class是org.eclipse.core.launcher.Main.main,在3.0版本前,一直是通过startup.jar包中这个类里启动Eclipse,3.0版本后采用了OSGi框架,OSGi的框架中Eclipse的实现是equinox项目,在3.0版本后,原来的startup.jar合并到了equinox的launcher包中。
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方法调用的是basicRun是Eclipse的主要启动函数,它的主要内容包括:
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.ini中osgi.framework的指定的Jar包进行启动。
2.getInstallLocation():获取当前安装路径。它先从系统配置信息中获取安装路径,如果没有,则通过获取main类包的路径换算出安装路径(Main.class.getProtectionDomain().getCodeSource().getLocation())方式获取。
3.getBootPath:获取启动路径列表,读取osgi.framework及osgi.framework.extensions(逗号分割)。
4.setupJNI:首先获取--launcher.library的路径,并根据操作系统、架构、窗体架构等信息,加载相应的本地文件(例如:dll或so)。并使用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.EclipseStarter的run方法。
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整体没有一个很好的了解,学习梯度还是比较大的,经常看着看着只见树木不见森林了。