了解 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)定義。
如前所述,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ù)。
在 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 插件的代碼段。
<?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 中的同一插件定義。
<?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