摘 要 由于Eclipse提供了一個開放靈活的框架,,Eclipse技術(shù)現(xiàn)在廣為流行,,基于Eclipse構(gòu)架的應(yīng)用越來越多,。本文先對Eclipse的結(jié)構(gòu)進行了剖析,,分析了Eclipse使用的技術(shù)及實現(xiàn)原理。最后給出了一個基于Eclipse RCP應(yīng)用的項目實例,。
關(guān)鍵詞 Eclipse,;插件;嵌入式,;RCP
●0引言 Eclipse是一個具有先進軟件設(shè)計和實現(xiàn)技術(shù)的開發(fā)框架,。應(yīng)用軟件在Eclipse中被稱為“插件”。它們在架構(gòu)中互動工作,,完美的集成,。隨著Eclipse3.0加強了對RCP(Rich Client Program)開發(fā)的支持,Eclipse已成為廣為業(yè)界所支持的開放性標(biāo)準軟件開發(fā)環(huán)境,,業(yè)界已成事實的工業(yè)標(biāo)準。
Eclipse的特點:跨平臺,;提供了GUI和非GUI,;語言中立;基于插件的開放的,、可擴展的平臺,。
●1. Eclipse技術(shù)剖析 1.1 Eclipse體系結(jié)構(gòu)概述 Eclipse的結(jié)構(gòu)體系如下圖所示:
圖1 Eclipse體系結(jié)構(gòu)圖 Eclipse類似于“軟總線”的體系結(jié)構(gòu),,
Eclipse的核心部分(
Platform Runtime)類似于一條“即插即用”的“總線”,它提供了許多的“插槽”(擴展點:extension point),。其余的部分都可看成類似于外部設(shè)備的“插件”(Plug-in),,可隨時加載和卸載。更為靈活的是每個插件又提供了“插槽”可繼續(xù)安裝其他的插件,。
Eclipse分為Eclipse平臺【可以理解為PlatForm Runtime?】,、
JDT、
PDE,、
其他的插件幾個部分,。其中Eclipse平臺是整個系統(tǒng)的基礎(chǔ),Eclipse的核心,。JDT是提供了用于編輯,、查看、編譯,、調(diào)試和運行Java代碼的專門插件,。PDE構(gòu)建于Eclipse平臺和JDT之上,提供了專門開發(fā)插件的工具,。
Eclipse平臺是在其上創(chuàng)建插件擴展的核心框架和服務(wù)的名稱,,是一個通用的基礎(chǔ)架構(gòu)。平臺由平臺運行時,、工作空間,、工作臺、幫助,、小組,、調(diào)試構(gòu)成。平臺在結(jié)構(gòu)上大致可分為核心(core)和用戶界面(UI)兩層,。核心是與用戶界面無關(guān)的基礎(chǔ)結(jié)構(gòu),,包含平臺運行時和插件管理、工作空間和資源管理以及版本和配置管理,。其中平臺運行時又是Eclipse平臺的核心,。
1.2 平臺運行時(Platform Runtime): 運行時相當(dāng)于一個
微內(nèi)核,是插件的核心引擎,。它位于平臺核心中最低級別的部分,,由org.eclipse.osgi和org.eclipse.core.
runtime兩個插件組成,其他所有的插件都依賴于這兩個插件,。
1)運行時的功能:
a)定義插件的結(jié)構(gòu)以及它們包含的實現(xiàn)詳細信息(bundle 和類載入器),。
b)查找和執(zhí)行主要的Eclipse應(yīng)用程序以及維護插件的注冊表、擴展和擴展點。
c)提供實用程序(例如,,記錄,、調(diào)試跟蹤選項、適配器,、首選項庫和并發(fā)性基礎(chǔ)結(jié)構(gòu)),。
2)運行時工作原理:
運行時管理著一個
插件注冊表(所有插件的標(biāo)識),當(dāng)Eclipse啟動時,,運行時內(nèi)核
1.先是定位JRE的位置
3.然后查找清單文件中聲明的extension point和extension,,將二者匹配,,保存插件的依賴關(guān)系。最后啟動應(yīng)用,。
運行時對插件實行“lazy load“,,只有當(dāng)需要使用插件時才將其調(diào)入內(nèi)存。不需要時選擇適當(dāng)?shù)臅r機清除出內(nèi)存,。
1.3 OSGi-1.4 Eclipse平臺技術(shù)的核心參照 1.3.1 OSGi概述: Eclipse體系架構(gòu)是參照OSGi實現(xiàn)的,。核心插件org.eclipse.osgi就是OSGi的實現(xiàn)。
OSGi(Open Service Gateway Initiative)是一個為家用硬件設(shè)備的遠程互訪建立的一個開放的規(guī)范,。它包括構(gòu)建開放的可交付網(wǎng)絡(luò)服務(wù)的各方面,。
OSGi中的應(yīng)用稱為bundle,每個bundle可提供一定數(shù)量的服務(wù)(
Services),。每一個安裝在OSGi服務(wù)平臺的bundle都有一個與之關(guān)聯(lián)的
bundle對象(object),,它負責(zé)管理bundle的生命周期。bundle有諸如安裝,、停止,、活動等多種狀態(tài)。
1.3.2 OSGi主要的規(guī)范 ◆n 框架規(guī)范(Framework):
OSGi規(guī)范的核心,提供了一個通用的,、安全可管理的Java 框架,。提供了以下功能:
管理bundle的安裝和更新。bundle安裝后會注冊一定數(shù)量的服務(wù),可被同一Framework下的其他bundle使用,。不同bundle提供的Services可構(gòu)成一個大規(guī)模的Services,,不同的bundle和Services形成依賴。這種依賴關(guān)系由Framework負責(zé)管理,。
Framework為bundle提供了代碼動態(tài)加載的功能, OSGi兼容設(shè)備可以任意加載和卸載OSGi bundle,。使得開發(fā)者開發(fā)、部署一個大規(guī)模的Services變的很容易,。Framework還為Java bundle開發(fā)者提供了簡明一致的編程模型,,允許開發(fā)者將自己的接口規(guī)范綁定到OSGI環(huán)境中的Services。
◆包管理服 務(wù)(Package Admin Service)規(guī)范:管理不同n bundle之間的引用關(guān)系。 當(dāng)bundle更新或者卸載時判斷是否有其他的服n 務(wù)正在使用當(dāng)前的bundle,。
◆ 啟動層次(Start Level)規(guī)范:定義了啟動和停止一個OSGi服n 務(wù)平臺時,n 不同n bundle的啟動或者停止的先后順序,。
◆ 權(quán)限管理服務(wù)(Permission Admin Service)規(guī)范:對bundle間的訪問權(quán)限進行控制,。
Eclipse實現(xiàn)了OSGi規(guī)范,平臺運行(runtime)實現(xiàn)了Framework標(biāo)準,,提供了相應(yīng)的核心功能,。插件在效果上相當(dāng)于bundle,整個體系靈活而且強大,。
1.4 Eclipse的插件技術(shù): 1.4.1 與插件相關(guān)的概念 ◆ 插件(Plug-in):Eclipse功能實現(xiàn)的最小單位,包含Java代碼或其他文件,。實現(xiàn)插件的類一般都繼承或?qū)崿F(xiàn)某些類或接口。插件位于plugins目錄下,,n 使用清單文件plugin.xml向系統(tǒng)說明如何集成到平臺,。
◆ 擴展點(
extension point):具有命名n 特性的信息收集點,n 也就是為插件提供的接口,。每一個插件都是在已有的擴展點上開發(fā),,同n 時可自定義擴展點,n 以便在這個插件上繼續(xù)開發(fā),。正是由引入了擴展點,,n 插件不n 僅可以安裝在Eclipse的平臺上,n 還可以安裝到其他插件上,。
◆擴展(extension):對擴展點的實現(xiàn),。每個插件至少實現(xiàn)了一個擴展點。
1.4.2 Eclipse插件的通信機制 插件之間的通信是通過擴展點來實現(xiàn)的,。首先插件A聲明了擴展點P及其實現(xiàn)規(guī)則接口I,。插件B如果要擴展插件A的擴展點P,
則生成一個實現(xiàn)接口I的類C,,從而實現(xiàn)對P的擴展,。在
實際運行時,插件A找到類C并實例化,,然后調(diào)用其實現(xiàn)了接口I中的方法,。
圖2 插件的通信機制 當(dāng)需要與實現(xiàn)某擴展點的插件通信時,根據(jù)實現(xiàn)擴展的插件清單
plugin.xml中
extension標(biāo)簽聲明中的“class”屬性查找并裝入類,,再根據(jù)實現(xiàn)擴展類的規(guī)則來調(diào)用該類中的方法,,從而實現(xiàn)了擴展。
●2Eclipse技術(shù)的應(yīng)用: 2.1 開發(fā)插件 利用PDE可以方便快捷把應(yīng)用程序開發(fā)成插件,,打包后放到plugins目錄下,,Eclipse啟動時會找到相應(yīng)的插件。這種方式可開發(fā)GUI和非GUI插件。如開發(fā)GUI插件,,一般是對平臺的操作組(actionSets)進行擴展,,實現(xiàn)在菜單欄中添加菜單項。然后提供透視圖,、視圖,、編輯器的擴展。其過程如下,。使用這種方式開發(fā)的應(yīng)用只能作為Eclipse的插件運行,,必須安裝Eclipse。
插件開發(fā)的流程
1)決定插件如何與平臺集成
2)標(biāo)識需要進行添加的擴展點以便與用戶的插件進行集成
3)根據(jù)擴展點的規(guī)范來實現(xiàn)這些擴展,。如實現(xiàn)擴展點所要求的特定的接口,。
4)提供清單文件(plugin.xml),它描述用戶正在提供的擴展以及代碼的封裝,。Eclipse就是解析這個文件來加載插件的,。
2.2 開發(fā)RCP應(yīng)用 胖客戶端程序(RCP)是指
運算和商務(wù)邏輯是在客戶端實現(xiàn)的應(yīng)用,相反的在服務(wù)器端實現(xiàn)的稱為瘦客戶端程序,。
Eclipse RCP提供了一個通用的工作臺,,開發(fā)人員可以擴展該工作臺來構(gòu)造自己的應(yīng)用程序。利用RCP可以開發(fā)出獨立的應(yīng)用,,從而脫離了Eclipse平臺的IDE環(huán)境,。一個RCP至少要實現(xiàn)一個插件,并且可以使用與 Eclipse IDE 相同的用戶界面元素,。
運行Eclipse RCP不需要安裝Eclipse,。
開發(fā)Eclipse RCP的步驟:
1)確定擴展點。插件需要實現(xiàn)哪些擴展點,。
2)編寫插件清單plugin.xml,。
3)生成組件類來實現(xiàn)擴展。
4)創(chuàng)建WorkbenchAdvisor 類,。構(gòu)建 RCP的核心任務(wù)之一就是創(chuàng)建一個實現(xiàn)抽象類WorkbenchAdvisor的類,。WorkbenchAdvisor負責(zé)配置工作臺,當(dāng)執(zhí)行 RCP 應(yīng)用程序時,,將顯示該工作臺,。
5)接下來需要創(chuàng)建Application類。它相當(dāng)于與Java類中的main方法,,是RCP應(yīng)用程序的主要入口點,,需要定義org.eclipse.core.runtime.applications 擴展點,并實現(xiàn)IPlatformRunnable接口,。
6)創(chuàng)建并導(dǎo)出一個應(yīng)用程序,,并生成一個插件,。將其放在plugins目錄。
7)配置config.ini文件,。需要定義product,、application和閃屏等信息。
圖3 信息家電嵌入式仿真開發(fā)平臺目錄結(jié)構(gòu) 2.3 構(gòu)造開發(fā)環(huán)境IDE 由于Eclipse實現(xiàn)了RCP 技術(shù),,重構(gòu)了Eclipse的核心,,使得工作平臺與IDE分離。實現(xiàn)了一個獨立的工作平臺,。利用平臺提供的擴展點可以更加方便的構(gòu)建IDE,把工具開發(fā)成插件,,添加到平臺即可,。比如添加JDT插件,就會構(gòu)造出開發(fā)Java的IDE,,提供了CDT就可以用來開發(fā)C/C++,。理論上可以構(gòu)建任何類型的IDE。
●3 Eclipse技術(shù)在信息家電嵌入式仿真開發(fā)平臺研制中的應(yīng)用 3.1信息家電嵌入式仿真平臺系統(tǒng)概述 系統(tǒng)通過對ARM系列處理器指令集及體系結(jié)構(gòu)的模擬,、外部設(shè)備功能的仿真,,構(gòu)造了一個虛擬運行環(huán)境,其上運行LINUX操作系統(tǒng)和應(yīng)用,。系統(tǒng)具有很好的仿真性能,。
圖4 仿真平臺系統(tǒng)總體結(jié)構(gòu)圖整個系統(tǒng)為一個RCP應(yīng)用,各子系統(tǒng)以插件的形式實現(xiàn),。在實現(xiàn)過程中充分利用了Eclipse技術(shù):如利用了Workbench能夠添加“標(biāo)準操作”的特點,;借鑒JDT的模式封裝了系統(tǒng)的調(diào)試器;在開發(fā)圖形界面方面用到了SWT和JFace,,還有SWT多線程等,。
3.2 仿真平臺系統(tǒng)功能結(jié)構(gòu): 1)項目管理插件:
本子系統(tǒng)包括家電控制軟件開發(fā)階段所涉及的工具:工程管理器、編輯器,、編譯器,、匯編器、連接器以及常用標(biāo)準庫等,。
2)調(diào)試插件:
包括調(diào)試器,、調(diào)試代理。調(diào)試器實現(xiàn)了通常調(diào)試器的常用功能,,采用了JDT調(diào)試器的實現(xiàn)方法,,內(nèi)部封裝了GNU的調(diào)試工具。界面上采用Eclipse調(diào)試器的Views及Editors,。