gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          了解 Eclipse 插件如何使用 OSGi

          大多數(shù) Java™ 編程語(yǔ)言開(kāi)發(fā)人員通過(guò)作為 IDE 的功能認(rèn)識(shí)了 Eclipse。Eclipse IDE 實(shí)際上由叫做插件 的交互式組件的集合組成。這些插件組成了 IDE 的基礎(chǔ),它們還可用于創(chuàng)建其他桌面應(yīng)用程序。創(chuàng)建基于 Eclipse 的應(yīng)用程序所需的最小插件集稱為 Eclipse Rich Client Platform(RCP)。但是,插件本身不能啟動(dòng)。它們需要在一個(gè)環(huán)境中啟動(dòng)和操作。Eclipse 使用 OSGi R4 規(guī)范的實(shí)現(xiàn)提供了該環(huán)境。

          因?yàn)?Eclipse 在本質(zhì)上是由 OSGi 驅(qū)動(dòng)的,因此必須了解 Eclipse 插件的概念與 OSGi 框架有什么關(guān)系。在本文中,我將通過(guò)描述對(duì) Eclipse 平臺(tái)而言插件是什么來(lái)詳細(xì)解釋這種關(guān)系。然后,將描述在 Eclipse V2.1 平臺(tái)到今天基于 OSGi 的實(shí)現(xiàn)中插件的發(fā)展。最后,將詳細(xì)介紹應(yīng)用于 Eclipse 插件的 OSGi 提供的 manifest.mf 選項(xiàng)。

          插件是什么?

          Eclipse 聯(lián)機(jī)幫助將插件定義為:

          “插件是為系統(tǒng)提供功能的代碼和/或數(shù)據(jù)的結(jié)構(gòu)化包。可以以代碼庫(kù)(帶有公共 [應(yīng)用程序接口] API 的 Java 類(lèi))、平臺(tái)擴(kuò)展甚至文檔的形式來(lái)提供功能。插件可以定義擴(kuò)展點(diǎn)、定義良好的位置,其他插件可以在這些位置添加功能。”

          要注意的一個(gè)重點(diǎn)是插件以結(jié)構(gòu)化方式提供功能。它們可以提供服務(wù)(比如日志)或可用于用戶界面(UI)的功能,比如編輯器。不管什么功能,所有插件都以相同的結(jié)構(gòu)化方式來(lái)定義。 

          到 OSGi 的發(fā)展

          如前所述,Eclipse 使用 OSGi 作為插件系統(tǒng)的基礎(chǔ)。但并非總是如此。早期版本的 Eclipse 也設(shè)計(jì)為插件集合,而且 Eclipse 包括自己專(zhuān)用的插件系統(tǒng)來(lái)管理交互。但是,隨著 Eclipse IDE 要求的增長(zhǎng),必須需要一個(gè)更強(qiáng)壯的解決方案。這個(gè)新系統(tǒng)的基本要求包括動(dòng)態(tài)添加新插件和停止現(xiàn)有插件的能力。經(jīng)過(guò)大量研究之后,Eclipse 創(chuàng)建者決定通過(guò)實(shí)現(xiàn) OSGi 框架規(guī)范替換專(zhuān)用的插件框架。

          OSGi 是服務(wù)平臺(tái)的規(guī)范。Eclipse 提供了該規(guī)范的許多可用實(shí)現(xiàn)之一,并用作最新 OSGi R4 規(guī)范的參考實(shí)現(xiàn)。OSGi 是基于 Java 的框架,旨在用于需要長(zhǎng)運(yùn)行時(shí)間、動(dòng)態(tài)更新和對(duì)運(yùn)行環(huán)境破壞最小的系統(tǒng)。起初,OSGi 旨在用于家庭自動(dòng)化和家庭網(wǎng)關(guān)設(shè)備。最近,從手機(jī)到汽車(chē)都發(fā)現(xiàn)了它的蹤跡。

          在核心,OSGi 是一個(gè)組件和服務(wù)模型,如圖 1 所示。OSGi 規(guī)范定義了一個(gè)叫做綁定包 的模塊化單位。(在下文中,除非特別指明,Eclipse 術(shù)語(yǔ)插件 和 OSGi 術(shù)語(yǔ)綁定包 可交換使用,因?yàn)樗?Eclipse 插件現(xiàn)在都是 OSGi 綁定包。)OSGi 還提供了 Java Virtual Machine(JVM)級(jí)別的服務(wù)注冊(cè),該綁定包可用于發(fā)布、發(fā)現(xiàn)和綁定至服務(wù)。

          OSGi 規(guī)范定義了綁定包生命周期的基礎(chǔ)架構(gòu)和綁定包的交互方式。這些規(guī)則通過(guò)使用特殊 Java 類(lèi)加載器來(lái)強(qiáng)制執(zhí)行。在一般 Java 應(yīng)用程序中,CLASSPATH 中的所有類(lèi)都對(duì)所有其他類(lèi)可見(jiàn)。相反,OSGi 類(lèi)加載器基于 OSGi 規(guī)范和每個(gè)綁定包的 manifest.mf 文件中指定的選項(xiàng)(稍后將詳細(xì)介紹)來(lái)限制類(lèi)交互。

          Eclipse IDE 使用圍繞模塊化和綁定包生命周期的一個(gè) OSGi 子集。但是,它最低限度地使用了 OSGi 提供的服務(wù)支持。相反,Eclipse 提供自己的擴(kuò)展點(diǎn)系統(tǒng)來(lái)啟用綁定包交互。綁定包將功能暴露給其他擴(kuò)展。綁定包還定義自己的擴(kuò)展點(diǎn),允許其他綁定包向其貢獻(xiàn)功能。使用 Eclipse 中擴(kuò)展點(diǎn)的一個(gè)示例是 Preferences 窗口。核心 Eclipse 插件提供中央窗口,并暴露擴(kuò)展點(diǎn)以允許其他首選項(xiàng)頁(yè)面的貢獻(xiàn)。當(dāng)插件添加到 Eclipse 中時(shí),它們可以貢獻(xiàn)它們自己的頁(yè)面。Eclipse 中擴(kuò)展點(diǎn)的模型不同于基本的 OSGi 服務(wù)。綁定包擴(kuò)展點(diǎn)由定義綁定包擁有;其他綁定包只對(duì)這些點(diǎn)做貢獻(xiàn)。相反,任何綁定包可以實(shí)現(xiàn)和使用 OSGi 服務(wù)。

          使用 OSGi 實(shí)現(xiàn) Eclipse

          在 3.1 之前版本的 Eclipse 中,在每個(gè)插件的 plugin.xml 文件中定義插件依賴關(guān)系以及擴(kuò)展和擴(kuò)展點(diǎn)。在使用 OSGi 的新版本 Eclipse 中,依賴關(guān)系信息被分解到 manifest.mf 文件中,而 plugin.xml 文件只包含擴(kuò)展和擴(kuò)展點(diǎn)的 XML 定義。看一個(gè)演示該發(fā)展的生動(dòng)的工作示例十分有用。清單 1 展示了 Eclipse V3.0 中 org.eclipse.pde.ui 插件的代碼段。

          清單 1. org.eclipse.pde 插件中的代碼段

          <?xml version="1.0" encoding="UTF-8"?>
          <?eclipse version="3.0"?>
          <plugin
             
          id="org.eclipse.pde.ui"
             name
          ="%name"
             version
          ="3.0.2"
             provider-name
          ="%provider-name"
             class
          ="org.eclipse.pde.internal.ui.PDEPlugin">

             
          <runtime>
                
          <library name="pdeui.jar">
                   
          <export name="*"/>
                
          </library>
             
          </runtime>
             
          <requires>
                
          <import plugin="org.eclipse.core.runtime.compatibility"/>
                
          <import plugin="org.eclipse.ui.ide"/>
                
          <import plugin="org.eclipse.ui.views"/>
                
          <import plugin="org.eclipse.jface.text"/>
                
          <import plugin="org.eclipse.ui.workbench.texteditor"/>
                
          <import plugin="org.eclipse.ui.editors"/>
                
          <import plugin="org.eclipse.ant.core"/>
                
          <import plugin="org.eclipse.core.resources"/>
                
          <import plugin="org.eclipse.debug.core"/>
                
          <import plugin="org.eclipse.debug.ui"/>
                
          <import plugin="org.eclipse.help.base"/>
                
          <import plugin="org.eclipse.jdt.core"/>
                
          <import plugin="org.eclipse.jdt.debug.ui"/>
                
          <import plugin="org.eclipse.jdt.launching"/>
                
          <import plugin="org.eclipse.jdt.ui"/>
                
          <import plugin="org.eclipse.pde"/>
                
          <import plugin="org.eclipse.pde.build"/>
                
          <import plugin="org.eclipse.search"/>
                
          <import plugin="org.eclipse.team.core"/>
                
          <import plugin="org.eclipse.ui"/>
                
          <import plugin="org.eclipse.update.core"/>
                
          <import plugin="org.eclipse.ui.forms"/>
                
          <import plugin="org.eclipse.ant.ui"/>
                
          <import plugin="org.eclipse.jdt.junit"/>
                
          <import plugin="org.eclipse.ui.intro"/>
                
          <import plugin="org.eclipse.ui.cheatsheets"/>
             
          </requires>


          <!-- Extension points -->
             
          <extension-point id="pluginContent" 
             name
          ="%expoint.pluginContent.name" 
             schema
          ="schema/pluginContent.exsd"/>
             
          <extension-point id="newExtension" 
             name
          ="%expoint.newExtension.name" 
             schema
          ="schema/newExtension.exsd"/>
          <extension-point id="templates" 
          name
          ="%expoint.templates.name" 
          schema
          ="schema/templates.exsd"/>
          <extension-point id="samples" 
          name
          ="%expoint.samples.name" 
          schema
          ="schema/samples.exsd"/>

          <!-- Extensions -->
             
          <extension
                   
          point="org.eclipse.ui.perspectives">
                
          <perspective
                      
          name="%perspective.name"
                      icon
          ="icons/eview16/plugins.gif"
                      class
          ="org.eclipse.pde.internal.ui.PDEPerspective"
                      id
          ="org.eclipse.pde.ui.PDEPerspective">
                
          </perspective>
             
          </extension>

          <export name="*"/> 聲明暴露了插件中的所有包以供其他插件使用。插件依賴關(guān)系導(dǎo)入部分列出了 org.eclipse.pde.ui 插件需要的必備插件。

          接下來(lái)兩部分定義了 org.eclipse.pde.ui 可用于其他插件的擴(kuò)展點(diǎn)以及它對(duì)其他插件的貢獻(xiàn)。在本例中,可以看到自定義 Eclipse Plug-in Development Environment(PDE)視圖的定義。

          下面來(lái)看 Eclipse V3.1 中的同一插件定義。

          清單 2. Plugin.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <?eclipse version="3.0"?>
          <plugin>

              
          <!-- Extension points -->
             
          <extension-point id="pluginContent" 
             name
          ="%expoint.pluginContent.name" 
             schema
          ="schema/pluginContent.exsd"/>
             
          <extension-point id="newExtension" 
             name
          ="%expoint.newExtension.name" 
             schema
          ="schema/newExtension.exsd"/>
             
          <extension-point id="templates" 
             name
          ="%expoint.templates.name" 
             schema
          ="schema/templates.exsd"/>
             
          <extension-point id="samples" 
             name
          ="%expoint.samples.name" 
             schema
          ="schema/samples.exsd"/>

          <!-- Extensions -->
             
          <extension
                   
          point="org.eclipse.ui.perspectives">
                
          <perspective
                      
          name="%perspective.name"
                      icon
          ="icons/eview16/plugins.gif"
                      class
          ="org.eclipse.pde.internal.ui.PDEPerspective"
                      id
          ="org.eclipse.pde.ui.PDEPerspective">
                
          </perspective>

          posted on 2008-03-12 18:49 gembin 閱讀(1733) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Eclipse

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(lèi)(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊(cè)

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          free counters
          主站蜘蛛池模板: 清徐县| 延吉市| 奇台县| 罗山县| 德保县| 闸北区| 泰州市| 西宁市| 上高县| 长武县| 乐清市| 崇信县| 东乌珠穆沁旗| 漯河市| 永州市| 本溪| 闻喜县| 兰西县| 德惠市| 汽车| 苏尼特右旗| 开封县| 黄山市| 化德县| 体育| 肇东市| 朝阳县| 丘北县| 济宁市| 乌审旗| 舟曲县| 上饶县| 黄大仙区| 泸州市| 娄烦县| 临朐县| 囊谦县| 邳州市| 元谋县| 深水埗区| 霞浦县|