最近我一直在研究Eclipse的架构体系下面我们就来看看Eclipse的启动机制吧
Eclipse源代码
eclipsesourceBuildsrcIncludedzip 版本 大小MB
下载地址
解压后的目录结构如下图通过执行buildbat可以编译出完整的Eclipsesdk运行包和我们网上下载的一样但是这个过程可能需要一个小时左右的时间要有耐性哦所有的插件工程目录在plugins中我们只需要导入现有工程即可把plugins下所有工程导入
下面我们就先来研究一下Eclipse最核心的部分就是RCP部分必须的插件下面我列出了Eclipse RCP需要的插件
将这些代码解压缩到一个空目录里然后导入到Source Insight的Project里
二Eclipse启动过程
首先我们从Eclipse的启动过程开始分析
exe部分的引导
eclipseexe是Eclipse的启动文件是与平台相关的可执行文件它的功能比较简单主要是加载startupjar文件代码在Eclipse源代码的eclipsesourceBuildsrcIncludedpluginsorgeclipseplatformlaunchersrczip对应多个平台对于win平台你可以直接运行win目录下的buildbat文件来编译得到它(需要安装C编译器)
java代码部分的执行入口
对于Eclipse 版本来说如果在eclipse目录下没有找到startupjar则直接执行orgeclipseequinoxlauncherMainmain方法
当然我们可以在eclipse目录下定制我们自己的启动引导包startupjar现在Eclipse 好像已经不建议这样做了如果有这个包那么这个包将是java代码的执行入口你可以在命令行下运行java jar startupjar命令来启动Eclipse它的入口是relauncherMain类这个类最终执行的还是orgeclipseequinoxlauncherMainmain方法它对应的源代码在orgeclipseequinoxlauncher目录下的Mainjava关于此文件的定制详细信息请查看eclipsesourceBuildsrcIncludedpluginsorgeclipseplatformlaunchersrczip中的eclipsec的注解部分
我们从main函数往后跟蹤找到basicRun方法这个是启动的主要部分
protectedvoid basicRun(String[] args) throws Exception {SystemgetProperties()put(eclipsestartTime LongtoString(SystemcurrentTimeMillis())); //$NONNLS$commands = args;String[] passThruArgs = processCommandLine(args);if (!debug)// debug can be specified as system property as welldebug = SystemgetProperty(PROP_DEBUG) != null;setupVMProperties(); //设置VM属性processConfiguration(); //读取configuration/configini配置文件// need to ensure that getInstallLocation is called at least once to initialize the value// Do this AFTER processing the configuration to allow the configuration to set// the install locationgetInstallLocation();// locate boot plugin (may return dev mode variations)URL[] bootPath = getBootPath(bootLocation);//Set up the JNI bridge We need to know the install location to find the shared librarysetupJNI(bootPath);//ensure minimum Java version do this after JNI is set up so that we can write an error message//with exitdata if we failif (!checkVersion(SystemgetProperty(javaversion) SystemgetProperty(PROP_REQUIRED_JAVA_VERSION))) //$NONNLS$return;setSecurityPolicy(bootPath); //设置执行权限// splash handling is done here because the default case needs to know// the location of the boot plugin we are going to usehandleSplash(bootPath);beforeFwkInvocation();invokeFramework(passThruArgs bootPath); //启动Eclipse内核}