鄭重聲明:本文是個人的筆記,不一定適用閣下,不過并不介意你閱讀。
我一直對Eclipse的架構(gòu)很感興趣,很想知道它怎樣利用OSGI框架來加載和管理各個插件(OSGI稱為Bundle),聽起來實(shí)現(xiàn)的過程不簡單,但我還是決定記錄一下其中的細(xì)節(jié),所以如果我有什么理解不正確的地方,請?zhí)嵝盐摇?/font>
Eclipse提供了一個本地可運(yùn)行方式來啟動Eclipse平臺,它包含兩部分:可執(zhí)行程序(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通過執(zhí)行這個jar文件來啟動Eclipse平臺,在Eclipse 3.3及以后的版本對此進(jìn)行了重構(gòu),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, 如果你在命令行參數(shù)中沒有指定 "-vm" 參數(shù),Eclipse會先從安裝目錄下找jvm的文件夾,如果發(fā)現(xiàn)有這樣一個文件夾,會在文件夾下搜索“jvm.dll"文件,如果找到這個文件,Eclipse將加載并啟動JVM,如果沒有找到,會根據(jù)環(huán)境變量中指定的位置查找JVM,你也可以在命令行添加"-vm"參數(shù)或者安裝目錄下面的configuration文件夾下面的config.ini文件中指定特定的JVM的位置。
在找到JVM并啟動后,開始執(zhí)行org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar,這個jar文件中指定了運(yùn)行的主類:org.eclipse.equinox.launcher.Main,這個類負(fù)責(zé)初始化Eclipse的運(yùn)行環(huán)境,包括設(shè)置必要的系統(tǒng)屬性、解析和處理configuration/config.ini配置文件、加載OSGI框架的Jar文件、檢查Java版本是否符合Eclipse最低運(yùn)行要求、設(shè)置安全級別、顯示啟動的閃屏界面、最后通過加載"org.eclipse.core.runtime.adaptor.EclipseStarter.class"并調(diào)用它的run(String[], Runnable)方法來啟動Eclipse平臺.
EclipseStarter 位于org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar這個插件中,這個類不能被子類繼承,也不應(yīng)該被顯式實(shí)例化,這個類中提供的方法都是靜態(tài)方法。在這個類主要通過run(String[], Runnable)完成了Eclipse平臺的啟動,而在這個方法塊中的startup(String[], Runnable)負(fù)責(zé)初始化屬性和配置、注入系統(tǒng)鉤子(Hook)、創(chuàng)建OSGI框架 、注冊插件(Bundle)事件、加載基礎(chǔ)的插件、運(yùn)行OSGI框架等一系列操作啟動Eclipse平臺。在startup方法執(zhí)行完成后開始執(zhí)行run(Object),在這個方法中會創(chuàng)建EclipseAppLauncher的實(shí)例并將其注冊到OSGI的服務(wù)系統(tǒng)中,接著調(diào)用EclipseAppLauncher的start方法啟動,讀取插件擴(kuò)展點(diǎn)信息,查找聲明了"org.eclipse.core.runtime.applications"擴(kuò)展點(diǎn)的實(shí)現(xiàn)類,調(diào)用它的Run方法就開始啟動,這基本上就是Eclipse平臺的基本操作。下面是RCP程序的類調(diào)用層次:

如果你已經(jīng)閱讀到這里,說明你確實(shí)很感興趣,想要通過文字來描述代碼,很不容易,我建議你還是去閱讀一下上面提到的那兩個類:org.eclipse.equinox.launcher.Main和org.eclipse.core.runtime.adaptor.EclipseStarter,它們的確設(shè)計(jì)的很精彩,很有學(xué)習(xí)的價值。