Eclipse Ganymede 發行版包含 24 個獨立專案,涵蓋多元技術。本系列三部曲介紹 Ganymede 新特性:RCP(桌面)、RAP(Web)、eRCP(行動裝置),以及 Subversion 版本控制與 p2 更新安裝系統。本教程(第 2 部分)著重於 Rich Ajax Platform (RAP),示範如何將既有 RCP 程式碼遷移至 Web 平台。
本教程適合想了解如何將成熟 RCP 程式碼修改為 RAP 以實現 Web 豐富客戶端體驗的 Eclipse 開發者。需熟悉 Eclipse 平台與 Rich Internet Application (RIA) 概念,並知道如何配置與部署 Servlet 容器。
Ganymede 新增的 Rich Ajax Platform (RAP) 用於建構豐富客戶端應用程式——類似桌面有狀態 GUI 應用——並部署至 Web。RAP 將 Eclipse 程式設計模型引入 Web,構建 RAP 應用時可重用大部分既有 RCP 程式碼。這透過 Ajax 達成,但 Eclipse 讓您輕鬆利用 RCP 開發桌面應用的知識。為示範遷移過程,您將把第 1 部分開發的備忘記事本修改為使用 RAP。
開發前必須從 Eclipse 網站下載並設定目標平台。
RAP 允許使用 Eclipse 開發模型建構啟用 Ajax 的 Web 應用程式。若熟悉 RCP 桌面開發,已具備 RAP 開發技術。大部分 RCP 程式碼可在 RAP 中重用,意味著您能充分利用 Java 技術與 Eclipse API 開發 Web 應用。使用者將體驗無需重新整理頁面的完整 GUI 應用,且無需在桌面下載安裝。RAP 提供特殊的 Standard Widget Toolkit (SWT)、JFace 與 Workbench 實作(實際上是 RCP 子集)來達成此目標。
由於 RCP 與 RAP 基礎架構相似(見圖 1),源代碼極少修改即可實現外掛重用。同樣透過標準瀏覽器存取 RAP 應用,這由 RAP Widget Toolkit (RWT) 實現,取代 RCP 中的 SWT。

瀏覽器端元件呈現使用 qooxdoo Ajax 函式庫,一個功能完善的物件導向 JavaScript 框架,支援跨瀏覽器應用。RAP 抽象化 JavaScript 細節,讓您使用 Java API 建構 RIA。自訂元件開發者需具備 JavaScript、qooxdoo 與 RAP 知識。客戶端開發允許嵌入其他 JavaScript 框架、Flash 與 Applet 等技術。
RAP 是 RCP 子集,無法與 RCP 共存於同一 Eclipse 實例;必須單獨下載安裝 RAP 環境。
www.eclipse.org/rap/downloads(見圖 2)。


此操作載入 RAP 相關外掛,將目標平台從 RCP 切換為 RAP。現可開始修改備忘記事本使用 RAP。
透過遷移過程體會兩環境差異。
切換目標平台後,Eclipse 標示備忘記事本程式碼有錯誤(見圖 6)。原因在於既有專案原為 RCP 設計,切換目標後建構路徑缺少解析特定元素的外掛。部分外掛在 RAP 有對應等效項,部分則無,需微調才能通過編譯。

org.eclipse.ui 點擊 Remove 移除。org.eclipse.rap.ui(RAP 對應外掛)。

此步驟解決大部分編譯錯誤。逐一處理剩餘錯誤:
1. Shell 建構子
編輯 PersonalTaskViewer.java。RCP 中預設無參數建構子可建立 Shell,RAP 需顯式指定無樣式/顯示:
Shell shell = new Shell(); → Shell shell = new Shell(SWT.NONE);
2. 移除 SWT.HIDE_SELECTION
RAP 的 SWT 實作不含 SWT.HIDE_SELECTION,直接刪除參考。

3. 移除 CellEditor 參考
RAP 的 JFace 不支援 CellEditor,搜尋並刪除所有參考,例如在 createTableViewer 方法中:
/** 建立 TableViewer */
private void createTableViewer() {
tableViewer = new TableViewer(table);
tableViewer.setUseHashlookup(true);
tableViewer.setColumnProperties(columnNames);
tableViewer.setSorter(new PersonalTaskSorter(PersonalTaskSorter.TASK_DESC));
}
因不再有 CellEditor,可刪除 TaskCellModifier 類別(Package Explorer 中刪除 TaskCellModifier.java)。

RAP 啟動應用程式方式異於 RCP。RCP 使用 IApplication 介面實作;RAP 對應介面為 IEntryPoint。顧名思義,RAP 識別可啟動應用程式的點,一個應用程式可有多個入口點(各由唯一識別碼區分,作為啟動 URL 參數傳遞,如 <host>:<port>/rap?startup=<entrypointname>)。
EntryPoint 代表 RAP 應用程式主入口點,類比 SWT 應用程式的 main() 方法。在 WorkbenchAdvisor、Initial Perspective、ApplicationActionBarAdvisor 協助下建立 UI。
plugin.xml 切換至 Extensions 分頁(見圖 12)。org.eclipse.rap.ui.entrypoint。IEntryPoint 的 Java 類別。在編輯器中重新命名為 POEntryPoint 並點擊 class 超連結建立新類別(見圖 15)。

向導建立實作 IEntryPoint 的 POEntryPoint 類別,定義 RAP 應用程式基本生命週期:
package com.devworks.tutorial.po;
import org.eclipse.rwt.lifecycle.IEntryPoint;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.application.WorkbenchAdvisor;
public class POEntryPoint implements IEntryPoint {
public POEntryPoint() {}
public int createUI() {
Display display = PlatformUI.createDisplay();
WorkbenchAdvisor advisor = new ApplicationWorkbenchAdvisor();
return PlatformUI.createAndRunWorkbench(display, advisor);
}
}
createUI() 負責建立 Display 與 WorkbenchAdvisor,傳遞給 Workbench 執行。
從 Eclipse 內啟動應用程式需定義啟動配置。建議建立配置並隨專案保存以便重用。
com.devworks.tutorial.po 下建立 launch 目錄。PO_RAP_OSGI。

Equinox OSGi 框架符合 OSGi Core Framework R4 規範,包含啟動程式、引導結構與應用程式模型。RAP 使用 OSGi 作為伺服器端框架,需用 OSGi 框架啟動確保正常運行。(亦可用 RAP Launcher,但 OSGi Launcher 能確保在 Equinox 上運行的應用也能在 Servlet 容器中透過 Equinox 運行,本教程採用此方式。)
下一部分將示範如何配置 Jetty、運行應用程式、恢復編輯功能、品牌化、主題化與打包部署。