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