Eclipse3.0平臺簡介 作者:張增志 概要 Eclipse3.0平臺與Eclipse2.1平臺的一個重要的區(qū)別就是,Eclipse3.0平臺建立在一個Java框架上,即Open Services Gateway Initiative(OSGi)服務平臺.OSGi的采用,使Eclipse走上了完全動態(tài)平臺的發(fā)展道路.本文先簡要介紹OSGi框架,然后介紹OSGi框架和Eclipse3.0平臺的聯(lián)系. 概要 Eclipse3.0平臺與Eclipse2.1平臺的一個重要的區(qū)別就是,Eclipse3.0平臺建立在一個Java框架上,即Open Services Gateway Initiative(OSGi)服務平臺.OSGi的采用,使Eclipse走上了完全動態(tài)平臺的發(fā)展道路.本文先簡要介紹OSGi框架,然后介紹OSGi框架和Eclipse3.0平臺的聯(lián)系.
一. OSGi框架簡介 URL:http://blog.blogchina.com/upload/2004-11-24/20041124110530659453.jpg 圖1:Eclipse3.0架構(gòu) 如上圖所示,Eclipse3.0平臺是建立在OSGi(Open Services Gateway Initiative)服務平臺基礎之上的,所以有必要先介紹一下OSGi框架. OSGi框架 OSGi框架是一個通用,安全,可管理的Java框架,它支持被稱為"bundle"的可擴展和可下載的服務應用的部署.與OSGi兼容的設備可以下載和安裝基于OSGi標準的bundle,并且還可以刪除不再需要的bundle.另外,已安裝的bundle可以注冊一組服務(service),這些服務可以在OSGi框架的嚴格控制下被其他bundle共享. OSGi框架以一種動態(tài)和可升級的方式管理哪些處于OSGi環(huán)境中的bundle的安裝和更新,還管理bundle和服務(service)的依賴關系. Bundle 在OSGi服務平臺中,bundle是部署的Java應用的唯一實體.一個bundle由Java類和其它資源組成,它們提供功能給終端用戶,提供服務組件(serveices)給其它的bundle. Bundle是作為JAR文件被部署的.可以說,一個bundle就是一個JAR文件,它包括: 1> 容納了實現(xiàn)零個或多個服務的資源.這些資源可以是Java類文件,也可以是其它數(shù)據(jù)文件如HTML文件,圖標文件等. 2> 容納了一個manifest文件.該文件描述了JAR文件的內(nèi)容和與bundle相關的配置信息. 3> 陳述了對其他資源如Java中的包(package)的依賴關系. 4> 指明bundle中的一個Java類作為Bundle Activator接口的實現(xiàn)類.OSGi框架必須實例化該類并調(diào)用start和stop方法來啟動和停止bundle. MANIFEST.MF文件 每一個bundle都有一個描述其自身信息的MANIFEST.MF文件,該文件位于JAR文件中的META-INF目錄下. 我們知道,在生成普通的Java JAR文件時都會要求指定一個MANIFEST.MF文件與該JAR文件關聯(lián)在一起.MANIFEST.MF文件的內(nèi)容格式可能如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.5.3
Created-By: 1.4.2_04-b05 (Sun Microsystems Inc.) 在OSGi框架中,每一個bundle的MANIFEST.MF文件除了可以包括上述內(nèi)容外,還定義了自己的OSGi MANIFEST內(nèi)容格式,例如:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.5.3 Created-By: 1.4.2_04-b05 (Sun Microsystems Inc.) Bundle-Activator: test.osgi.exam2.Activator Export-Package: test.osgi.exam2.service Bundle-Name: English dictionary Bundle-Description: A bundle that registers an English dictionary service Bundle-Version: 1.0.0
上例中顯示的是一組MANIFEST頭(header)/值(value)對,如Bundle-Activator頭(header)的值為test.osgi.exam2.Activator. 在OSGi框架定義了一組標準的MANIFEST頭(header),每一個header都有其特定的含義.上例中定義的Bundle-Activator頭信息的值test.osgi.exam2.Activator表示用來啟動和停止"English dictionary" Bundle的類名. Export-Package頭信息的值test.osgi.exam2.service表示可以被導出的包名,即test.osgi.exam2.service包可以被其它Bundle導入并使用其中提供的服務(service). Bundle的受控狀態(tài) 一個Bundle可能處在下面的狀態(tài)之中: ■ 已安裝(installed) 在OSGi框架安裝Bundle時,將解析該Bundle的本地代碼的依賴關系.如果失敗,該Bundle將不會被安裝.一旦Bundle被安裝,OSGi框架將可對該Bundle的整個生命周期(如起動,停止,更新,卸載)進行控制. ■ 已解析(resolved) 當OSGi框架成功地解析Bundle的本地代碼的依賴關系時,該Bundle就進入解析狀態(tài).這些依賴關系包括: 1> Bundle的MANIFEST.MF文件中,MANIFEST頭Bundle-Classpath定義的類路徑依賴關系. 2> Bundle的MANIFEST.MF文件中,MANIFEST頭Export-Package和Import-Package定義的依賴關系. ■ 起動(starting) 一旦Bundle被起動,該Bundle的狀態(tài)就被設置為ACTIVE,并一直持續(xù)到該Bundle被停止.在起動前,MANIFEST.MF文件中MANIFEST頭Bundle-Activator定義的類將被實例化,該類實例的start方法被調(diào)用以起動Bundle. ■ 停止(stopping) 一旦Bundle被停止,該Bundle的狀態(tài)就被設置為RESOLVED.在停止前,上文中提到的Bundle-Activator類定義的stop方法被調(diào)用以停止Bundle. ■ 激活(active) 已經(jīng)被激活的Bundle可以進行自身狀態(tài)的更新.在任何時候,OSGi框架只能滿足一個Bundle的唯一版本可用.Bundle的更新操作支持該Bundle移植到一個高版本或向后兼容的版本. ■ 已卸載(uninstalled) 在卸載前,上文中提到的Bundle-Activator類定義的uninstall方法被調(diào)用以卸載Bundle,該方法將使OSGi框架提醒其他Bundle它正在進行卸載操作,并設置該Bundle的狀態(tài)為UNINSTALL.如果該Bundle與其他Bundle存在關系,如它導出一些被其他Bundle使用的包(即該Bundle的MANIFEST文件中定義了Export-Package值),OSGi框架在沒有被重啟的情況下將繼續(xù)確保這些包仍可用.如果該Bundle與其他Bundle沒有關系,OSGi框架將恢復到該Bundle被安裝前的狀態(tài). 下面的Bundle狀態(tài)圖描述了Bundle的受控狀態(tài). URL:http://blog.blogchina.com/upload/2004-11-24/20041124110552991489.jpg 圖2 類裝載(Class Loading) Bundle就是一個JAR文件,OSGi框架所面臨的首要問題就是,怎樣去獲取隨時可能被"扔進"框架中的Bundle內(nèi)的類文件和其它資源. 對于每一個已安裝或已解析的Bundle,OSGi框架都會建立該Bundle的Classloader.這個Classloader還被建立在下面圖3所示的委托模型中. URL:http://blog.blogchina.com/upload/2004-11-24/20041124110606586667.jpg 圖3 其中: 1> Bootstrap類裝載器裝載Java核心API中的類. 2> SystemClassLoader類裝載器可以是系統(tǒng)類路徑類裝載器和標準擴展類裝載器,還可以是其他用戶自定義類裝載器,裝載系統(tǒng)CLASSPATH上的類或Java擴展路徑上的類或用戶指定的類. 3> BundleClassLoader類裝載器裝載該Bundle的MANIFEST文件中Bundle-ClassPath頭所指定的類文件.如果該Bundle需要導入其它Bundle中導出的包,那么這些Bundle的類裝載器的實例也要被建立在如圖3所示的委托模型中,并為該Bundle提供它所需的類. 上文中只是對OSGi框架進行了簡短地介紹,關于它的詳細信息請參照: http://www. 二. Eclipse3.0插件和OSGi Bundle OSGi服務平臺規(guī)范是一個開放的架構(gòu),用戶可以根據(jù)自己的需要來實現(xiàn)這個規(guī)范.Eclipse3.0就提供了該規(guī)范的一個實現(xiàn). 我們知道,在OSGi中基本的模塊單元是Bundle,在Eclipse中則是插件(plug-in).在Eclipse2.1中,插件往往表現(xiàn)為plugins目錄下的一個文件夾.例如如下的目錄結(jié)構(gòu): + D:\eclipse + plugins + eclipseme + docs + icons + lib - about.html - CHANGES.txt - CREDITS.txt - eclipseme.jar - JETTY-LICENSE.html - LICENSE.txt - plugin.properties - plugin.xml - README.txt - toc.xml + org.apache.ant_1.5.3 上述eclipseme插件提供了Eclipse2.1平臺和J2ME的集成.在每一個Eclipse2.1插件中,都包含一個plugin.xml文件,其中描述了插件名,版本號,需要的JAR包和插件要使用的擴展點等等. ■ plugin.xml 插件清單文件 ■ plugin.properties 容納被plugin.xml引用的字符串. ■ about.html 證書信息 ■ *.jar 插件需要的類文件 ■ lib 容納第三方JAR包 ■ icons 容納icon文件,通常是GIF格式 ■ docs 容納文檔文件,通常是HTML格式 ■ toc.xml 文檔結(jié)構(gòu)清單文件 ■ (other files) 在Eclipse3.0中,插件不僅表現(xiàn)為plugins目錄下的一個文件夾,還包括一個MF文件.這個MF文件可以位于該插件文件夾下.也可位于configuration\org.eclipse.osgi\manifests目錄下.如: 例1: + D:\eclipse + configuration + org.eclipse.osgi + manifests - eclipseme_0.1.0.MF 例2: + D:\eclipse + plugins + org.eclipse.osgi_3.0.0 + META-INF - MANIFEST.MF 在Eclipse3.0中,插件也可被稱為Bundle.Bundle的類文件和資源文件就是插件文件夾下的JAR文件和其他資源文件,Bundle的MANIFEST文件就是上文中提到的MF文件. Eclipse的插件信息是被配置在plugin.xml中的.OSGi Bundle信息是被配置在MANIFEST.MF文件中的.下面就說說它們的聯(lián)系. plugin.xml包括三個部分的信息. 1> 插件基本信息.如插件名,插件ID號,插件版本號,插件提供者名和插件類的全限定名. 2> 插件的依賴關系和插件的運行庫. 3> 插件的擴展和擴展點. 在Eclipse3.0中,前兩部分的信息可以被配置在MANIFEST.MF文件中.如Eclipse3.0中的runtime插件.考慮到與Eclipse以前版本的兼容,plugin.xml文件仍然支持對上三部分信息的配置格式.但是,Eclipse3.0平臺運行在處理插件信息時,它認為插件是一個Bundle外加上擴展和擴展點. Eclipse2.1的平臺運行內(nèi)核緩存所有插件的注冊信息在Registry API中,所有這些信息是從.registry文件中或解析所有的plugin.xml文件(安裝新插件的情況下)獲取的.在Eclipse3.0中,Registry API已經(jīng)不被建議使用,對所有插件的注冊信息的緩存已被重構(gòu)為兩部分,一是Bundle數(shù)據(jù),另外是ExtensionRegistry API,它們分別從.bundledata或.state文件和.registry.X文件中獲取.這三個文件是Eclipse生成的,它們的數(shù)據(jù)來源是各個插件的plugin.xml和MANIFEST.MF文件.當平臺安裝新的插件時,它們都將被重新生成.之所以從它們中而不是直接解析plugin.xml和MANIFEST.MF文件,是要Eclipse起動更快. 在Eclipse3.0中,有些插件文件夾下并沒有MANIFEST.MF文件,這是為了兼容Eclipse以前版本的插件.對于每一個已被Eclipse3.0安裝(installed)的插件(Bundle),系統(tǒng)都會生成一個MF文件在configuration\org.eclipse.osgi\manifests目錄下(已經(jīng)有MANIFEST.MF文件的插件除外).被生成的MF文件內(nèi)容只是該插件的plugin.xml文件中擴展點外的部分數(shù)據(jù).
關于作者:本文作者張增志,目前在中國北京先進數(shù)通信息技術有限公司工作,從事Java方面的開發(fā)和研究。 Email:zzz8067@hotmail.com 聯(lián)系地址:北京市海淀區(qū)車道溝1號濱河大廈D座6層 郵編:100089
|