程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 探索Eclipse的OSGi控制台

探索Eclipse的OSGi控制台

編輯:關於JAVA

從 V3.0 開始,Eclipse 通過選擇開放服務網關協議(Open Services Gateway Initiative,OSGi)來替換先前版本中不穩定的 Eclipse 插件技術,從而實現了一次巨大飛躍。這次轉變對於用戶來說幾乎是透明的,因為現在所使用的插件的安裝和操作看上去和以前的插件沒有什麼不同。

圖 1. Eclipse 內的插件

由於 Eclipse 現在是在 OSGi 上構建的,因此我們在圖 1 中看到的插件是功能完整的 OSGi 包。(圖 2 顯示了使用 OSGi 控制台運行 Eclipse 實例內的包。)通過使用 OSGi,Eclipse 支持業內認可的開放標准並且現在可以利用 OSGi 提供的功能,包括安全性、HTTP 服務、用戶管理和其他功能。Eclipse 對 OSGi 的使用已經見到成效,因為我們看到插件間報告的沖突在減少而 Eclipse 的應用在持續增加。

圖 2. Eclipse 內的 OSGi 包

Eclipse、Equinox、OSGi,天哪!

OSGi Alliance 是一個獨立的、非盈利性組織,負責 OSGi 技術,類似於 Eclipse Foundation 的職能。OSGi Alliance 負責制定描述 OSGi 技術的規范。簡言之,OSGI 技術為應用程序開發提供了一種面向服務的基於組件的平台。各種實現都是基於這些規范的。最常見的一個實現是 Equinox,它是 Eclipse 的規范實現。OSGi 的另一個常見實現是 Apache 的 Felix 項目。

在我們繼續之前,本文假定您具有 Eclipse 和 OSGi 方面的工作經驗。如果不具備的話,建議先閱讀 Scott Delap 的文章 “了解 Eclipse 插件如何使用 OSGi”,然後再來研究 OSGi 控制台。

創建 OSGi 包

這次冒險的第一步是使用 插件開發環境(Plug-in Development Environment,PDE)在 Eclipse 中創建一個簡單的 OSGi 包。為此,需要使用 PDE 創建一個新的插件項目(File > New > Project > Plug-in Project)。在創建新的插件項目的過程中,確保設定正確的選項。首先,選擇插件目標平台作為 OSGi Framework,具體來說就是 Equinox。最後,為了簡短起見,使用 PDE 提供的 Hello OSGi Bundle 模板(參見圖 3)。我們現在創建好了將在本文中使用的包。

圖 3. PDE Hello OSGi bundle 向導

Hello OSGi 控制台

現在我們已經有了自己的 Hello 包,可以繼續並啟動框架以獲得 OSGi 控制台。要啟動框架,我們可以利用 PDE 的 OSGi Framework 啟動配置。首先,轉至啟動配置菜單(Run > Run ...)並為 Hello 包創建一個 OSGi Framework 啟動配置(參見圖 4)。此外,確保僅選擇運行 Hello 包所需的必要的包。完成此操作的一種簡單方法是在啟動配置中按 Deselect All 鍵並選中 Hello 包,接下來按 Add Required Plug-ins 鍵。

圖 4. PDE 的 OSGi Framework 啟動配置

插件和包:有何區別?

每當走過 Eclipse 開發人員的聚集地,您總會聽到人們在談論著兩個有魔力般的字眼:插件 和 包。兩者有區別麼?在營銷副總裁看來,兩個術語是同義的。包是插件,插件就是包。我們似乎一直在交替地使用這兩個術語。但是,從專業的視角來看,事情並非如此。准確地說,Eclipse 插件是利用擴展注冊表的 OSGi 包(即,包的根目錄中有 plug-in.xml)。而 OSGi 包就是 OSGi 包。

完成啟動配置並准備就緒之後,可以使用啟動配置對話框中的 Run 按鈕來啟動我們的包。完成後,應當會看到類似圖 5 的結果。

在圖 5 中,我們看到 Hello 包已啟動(使用控制台中打印的 HelloWorld 消息,表示包已被啟動)並且看到 osgi> 提示符。OSGi 提示符類似於 DOS 或者 Bash 提示符,可以在提示符處輸入對 OSGi 實例起作用的命令。在本例中,發出 ss 命令,該命令將快速顯示所有內容的狀態。建議您在普通的 Eclipse 實例中嘗試此命令,將發現所有內容只不過是隱藏著的一個 OSGi 包。要獲得普通 Eclipse 實例的 OSGi 控制台,只需用 -console 參數啟動 Eclipse。

圖 5. 首次啟動

啟動和停止包

在 OSGi 動態環境中,可以輕松地啟動和停止包。要測試此操作,讓我們使用簡單的 Hello 包。只需用 stop 命令即可停止包,然後用 start 命令啟動包。您應當會看到類似圖 6 的結果。

圖 6. 啟動和停止包

添加、刪除和更新包

OSGi 系統的另一個強大的方面是能夠在運行的 OSGi 實例中添加、刪除和更新包 —— 所有操作均無需重新啟動 Java? 虛擬機。圖 7 演示了包的安裝和卸載。

圖 7. 安裝和卸載包

錯誤診斷

有時在包或插件嘗試啟動的初始化過程中會發生錯誤。OSGi 控制台提供了一個有用的命令 —— diag —— 可以幫助您調試與包初始化相關的問題。例如,讓我們來檢驗一下圖 8,在嘗試啟動 Hello 包時,獲得一個錯誤。為了幫助診斷錯誤,對包運行 diag 命令並將看到運行時環境中缺少一個導入包。

圖 8. 控制台錯誤診斷

有用的控制台命令摘要

表 1. 有用的控制台命令

命令 描述 start 啟動給定了 ID 或符號名稱的包 stop 停止給定了 ID 或符號名稱的包 install 為當前實例添加一個給定了 URL 的包 uninstall 刪除當前實例的具有給定 URL 的包 update 為當前實例更新給定 URL 的包 active 列出當前實例中所有活動的包 headers 列出具有給定 ID 或符號名稱的包的標頭 ss 列出在當前實例中注冊的所有包的簡短狀態 services 列出給定了正確過濾器的服務 diag 在給定 ID 或符號名稱的包上運行診斷程序

還有很多其他 OSGi 命令可用。這裡列出的命令是我認為最有用的命令。要獲得所有命令的列表,只需在控制台中鍵入 help。

擴展控制台

人們說 Eclipse 的絕妙之處就在於它的可擴展性。控制台是以類似方式擴展的。這是十分重要的,因為作為一名開發人員,您可能向用戶提供某種服務。通過擴展控制台,您可以使高級用戶或管理員能夠調試關於服務的問題。

控制台不使用熟悉的擴展點,它具有一種簡單的可擴展性機制。讓我們通過幾個示例來說明控制台的可擴展性。

uname,OSGi 樣式

使用過 UNIX? 風格的系統的人都會熟悉 uname 命令,該命令將打印關於運行的操作系統的名稱、版本和其他信息。在 OSGi 上下文中,有各種不同風格的 UNIX 的方法就可以有 OSGi 控制台的不同實現(例如 Apache Felix、Knopflerfish 等等)。

擴展 OSGi 控制台的最重要部分是 CommandProvider 接口。希望擴展控制台的客戶機必須實現此接口。實現此接口後,下一步是啟動帶有 "_" 的方法名稱。這些方法將表示控制台中可用的命令。就這麼簡單!參見清單 1 中的示例。

清單 1. OSGi uname

public class Activator implements BundleActivator, CommandProvider {
private BundleContext context;
public void start(BundleContext context) throws Exception {
this.context = context;
Hashtable properties = new Hashtable();
context.registerService\
(CommandProvider.class.getName(), this, properties);
}
public String getHelp() {
StringBuffer buffer = new StringBuffer();
buffer.append("\tuname - returns framework information\n");
return buffer.toString();
}
public void stop(BundleContext context) throws Exception {}

public void _uname(CommandInterpreter ci) throws Exception {
String vendor = context.getProperty(Constants.FRAMEWORK_VENDOR);
String version = context.getProperty(Constants.FRAMEWORK_VERSION);
String osName = context.getProperty(Constants.FRAMEWORK_OS_NAME);
String osVersion = context.getProperty(Constants.FRAMEWORK_OS_VERSION);
System.out.println("\n " + vendor + " "
+ version + " (" + osName + " "
+ osVersion + ")");
}
}

包和存在主義

包本身可能從未質疑過自己的存在,這裡提供了一個簡單示例,它將打印出一個包是 vanilla 包還是 Eclipse 插件。(記住,兩者都還是包!)清單 2 通過添加新方法並修改 getHelp() 方法來構建先前的示例。

清單 2. 修改 getHelp()

...
public String getHelp() {
StringBuffer buffer = new StringBuffer();
buffer.append("\twhatami - \
returns whether the bundle is a plug-in or not\n");
buffer.append("\tuname - returns framework information\n");
return buffer.toString();
}

public void _whatami(CommandInterpreter ci) throws Exception {
try {
long id = Long.parseLong(ci.nextArgument());
Bundle bundle = context.getBundle(id);
URL url = bundle.getEntry("plugin.xml");
if(url != null) {
System.out.println("\n I'm \
(" + bundle.getSymbolicName() + ") a plug-in");
} else {
System.out.println("\n I'm \
(" + bundle.getSymbolicName() + ") not a plug-in");
}
} catch (NumberFormatException nfe) {
System.out.println("\n Error processing command");
}
}
...

圖 9 中顯示了我們的工作結果。

圖 9. 擴展控制台的結果

結束語

本文演示了如何使用 OSGi 控制台以及如何擴展控制台。在此過程中,我們查看了控制台以及如何擴展控制台的幾個示例。您現在已經更加熟悉控制台並且知道了如何在日常的 Eclipse 開發中使用控制台。使用控制台可能甚至會讓您回想起玩 Doom and Quake 時的情景。

圖 10. Quake 控制台

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved