最近我一直在研究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 well
debug = 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 location
getInstallLocation();
// 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 library
setupJNI(bootPath);
//ensure minimum Java version do this after JNI is set up so that we can write an error message
//with exitdata if we fail
if (!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 use
handleSplash(bootPath);
beforeFwkInvocation();
invokeFramework(passThruArgs bootPath); //啟動Eclipse內核
}
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28038.html