© 2005 by Frank Gerhardt, Christian Wege; made available under the EPL v1.0
Translation copyright © Toru Kawashima, NTT COMWARE CORPORATION
 Eclipse Corner Article

RCP Tutorial: Part 1

Summary
この Tutorial では EclipseCon 2005 で行われた Tutorial をサマリで Part 1, Part 2 に分けて紹介します。Eclipse 3.0 から導入された RCP (Rich Client Platform) を使って、RCP によるリッチクライアントの世界とその開発の COOL さを垣間見ていただけると思います。

※ このコンテンツは EclipseCon 2005 で行われた Tutorial 08: Developing Eclipse Rich Client Applicationsテキストを翻訳したものです。日本語訳に際して快くご協力いただいた Dr. Frank Gerhardt、Dr. Christian Wege 両氏に感謝いたします。

By Toru Kawashima, NTT COMWARE CO.
2005 / 4 / 25


はじめに

Eclipse が利用されるようになってすぐに、アプリケーション構築のためのツール、つまり IDE としてだけでなく、いわゆるアプリケーションとして利用されるようになりました。Eclipse開発チームはこの傾向を迎え入れて、Eclipse 3.0 と共に RCPを導入しました。これにより、リッチクライアントアプリケーションのためのプラットフォームが整理され、Eclipse ベースのアプリケーションの作成が容易になりました。

そこでここでは、リッチクライアントを実現する技術の一つとして、Eclipse リッチクライアントアプリケーションを紹介していきます。

チュートリアル概要

このチュートリアルでは、RCP ベースのアプリケーションの開発、パッケージング、デプロイメント、更新の総合的なアーキテクチャについて以下のように Step を踏んで紹介していきます。

Part 1 では、とっても小さなアプリケーションを開発します。これはとてもリッチとはいえませんが、アプリケーションの構造を確認するには十分といえます。そしてこのアプリケーションの配布まで行います。

Part 2 では、少々複雑なアプリケーションを作成し、ヘルプシステムを追加します。さらに branding を加味した feature を追加し、配布のためにアプリケーションをパッケージングします。さらに、アップデートサイトやアップデートマネージャを利用してどのようにアップデートを配布するかを紹介します。

Part 3 では、RCP におけるテストを説明していきます。

チュートリアル中では、Eclipse に同梱されている template を利用します。この template は Eclipse のコンポーネントを追加したり、開発の Step をデモンストレーションするのに非常に役に立ちます。

準備

以下の環境を準備します。

eclipse-RCP-3.1M6-win32.zip
eclipse-RCP-SDK-3.1M6-win32.zip
eclipse-SDK-3.1M6-win32.zip

このチュートリアルは Windows XP 上で行われていますが、他のプラットフォームでも細かい変更のみで読み替えられると思います。その一つとして上記アーカイブはご利用のプラットフォームにあわせて用意してください。

 

Eclipse インストール

以下のディレクトリ構成を利用します。

インストールします。

起動が確認できたら準備完了です。

 

基本RCPアプリケーションの作成

Eclipse は RCP アプリケーションを作成するためのウィザードを用意しています。これによりシンプルなスケルトンを作成できます。このウィザードを利用すると次のステップで RCP アプリケーションを作成できます。

プロジェクトを作成してみましょう

とってもシンプルな RCP アプリケーションが作成できました。同時に Plug-in Manifest Editor が起動してきています。このタブについて簡単に見ていきます。

"Overview" タブはこの Plug-in の ID と名前を示しています。

"Dependencies" タブは直接的な依存関係を示していますが、間接的なものは現していません。しかし、実際に RCP アプリケーションを動作させるためには、直接的、間接的両方の依存性を必要とします。これはアプリケーションの配布の際に重要になります。ただ、ここでは詳しくは触れずに、後にコンフィグレーションウィザードを使って、どのようにこの依存関係をからパッケージングを行うかを説明します。

"Extensions" タブでは、Plug-in 上に定義された新しいアプリケーションを示しています(RCP アプリケーションは Plug-in の一種です)。同時に、ひとつの新しい perspective も定義しています。これは後ほどソースコードで見ていきます。

新しい Plug-in Project Wizard はrcpdemo アプリケーションに必要なソースコードも同時に作成してくれます。このソースコードを見る前に、なにはともあれ、アプリケーションを起動してみましょう。

 

Rich Client Application の起動

そこで launch configuration を操作します。現在の Plug-in Manifest Editor は適切な launch configuration を生成するための便利な手段を提供しています(Overview タブを参照)。

起動してみましょう

ようやく RCP アプリケーション(workbench)が起動しました。

Eclipse は 既存の workbench を拡張した view や editor, perspective といったものから構成されています。一方、リッチクライアントアプリケーションは自分自身の workbench をもっています。つまり、 rcpdemo においては通常 workbench 内で起動する view などがまだなにも定義されていないことになります。そこで、リッチクライアントアプリケーションを起動するために、必要な Plug-in を定義したり、既存の workbench を置き換えるアプリケーションを 示す必要があります。

ここで、launch configuration を見てみましょう。

"Main" タブでは、workspace データの格納ディレクトリを指定しています。"Program to Run" セクションでは "rcpdemo.application" が選択されています。後ほど、リッチクライアントアプリケーションがどのようにプロダクトとして起動するかを見ていきます。

"Plug-ins" タブでは必要なすべての plug-in がリストされています。これは、Plug-in Manifest Editor で表示されていた直接依存している plug-in の情報から、launch configuration によってすべての直接的、間接的依存関係が網羅されたことになります。

"configuration" タブでは設定情報の格納先を示しています。そこにある "config.ini" ファイルを見てみましょう。

次のようにして Eclipse の View に表示してみましょう。

このファイルは、"plug-ins" タブに現れていた plug-in を含んでいて、この情報から生成されています。OSGi runtime はこの設定ファイルに書かれた plug-in の内容を読み取ります。

OSGi ( Open Services Gateway Initiative ) はソフトウェアの管理を容易にするための仕組みで、Eclipse では plug-in の追加削除などの管理に利用しています。

 

RCP Application の基本要素

ここで、rcpdemo のソースコードを見てみましょう。Eclipse 上では以下の構成になっています。

RCPdemoPlugin

リッチクライアントアプリケーションは Eclipse plug-in の一種なので、plug-in クラスを必要とします。このクラスは plug-in インスタンスにアクセスしたり、リソースバンドルをロードしたりします。

Application

これは bootstrap クラスです。このクラスはメインイベントループを持つ workbench を生成し起動します。

public class Application implements IPlatformRunnable {

    public Object run(Object args) throws Exception {
        Display display = PlatformUI.createDisplay();
        try {
            int returnCode = PlatformUI.createAndRunWorkbench(display, 
                new ApplicationWorkbenchAdvisor());
            if (returnCode == PlatformUI.RETURN_RESTART) {
                return IPlatformRunnable.EXIT_RESTART;
            }
            return IPlatformRunnable.EXIT_OK;
        } finally {
            display.dispose();
        }
    }
}

Perspective

workbench 内の UI エレメントを構成するために利用します。ただし現在のところ、rcpdemo はひとつも view を持っていないため、perspective には何もありません。

public class Perspective implements IPerspectiveFactory {
    public void createInitialLayout(IPageLayout layout) {
    }
}

ApplicaitonActionBarAdvisor

action bar advisor は、menu バーなどのようにさまざまな action を利用するための hook (拡張ポイント)を提供します。これはまた、ステータスラインを設定したり、アクションを生成したりします。

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer); } protected void makeActions(IWorkbenchWindow window) { } protected void fillMenuBar(IMenuManager menuBar) { } }

ApplicationWorkbenchAdvisor

workbench advisor は自分自身のライフサイクルに関する hook を提供します。もっとも重要な役割のひとつが ApplicationWorkbenchWindowAdvisor に対して提供されています。

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
    private static final String PERSPECTIVE_ID = "rcpdemo.perspective";

    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
        return new ApplicationWorkbenchWindowAdvisor(configurer);
    }

    public String getInitialWindowPerspectiveId() {
        return PERSPECTIVE_ID;
    }
}

ApplicaitonWorkbenchWindowAdvisor

workbench window advisor は自分自身のライフサイクルに関する hook を提供します。例えば、window をオープンする前に window サイズを設定する、などです。ここでは、ウィンドウサイズとタイトルが設定されています。

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {


    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
        super(configurer);
    }


    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
        return new ApplicationActionBarAdvisor(configurer);
    }

    public void preWindowOpen() {
        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
        configurer.setInitialSize(new Point(400, 300));
        configurer.setShowCoolBar(false);
        configurer.setShowStatusLine(false); 
        configurer.setTitle("Hello RCP");
    }
}

rcpdemo applicaiton の workbench window のサイズの変更をしてみましょう。

 

RCP-distribution への展開

ここまでで rcpdemo の起動とソースコードの概要を眺めてきました。しかし、今のところ起動できたといってもあくまで Eclipse SDK 上で起動したことになります。エンドユーザはデスクトップアプリケーションのように起動したいと考えているでしょう。そのため、開発環境としての Eclipse からアプリケーションを export して、RCP distribution 上に展開する必要があります(RCP SDK は plug-in のソースコードも含んでいますが、RCP destribution はソースコードを含まない最小限の plug-in のセットのみで構成されています)。

Export Wizard

展開してみましょう

上記によって "eclipse" ディレクトリは RCP を含んでいます。rcpdemo アプリケーションの eclipse.exe が見つかるはずです。これを実行してみましょう。

エラーを表示するダイアログが表示されると思います。

application ID が見つかりません、というエラーです。RCP distribution は単なるプラットフォームなので、すでに定義されたアプリケーションの情報や、アプリケーション ID といったものを持っていないのです。

では次のようにコマンドラインからを実行してみましょう。

eclipse -application rcpdemo.application      

それでもまだエラーが出ていると思います。今度はコマンドラインから与えた ID が見つからないというエラーです。これはつまり、rcpdemo は Eclipse の runtime 時には見つからないということです。実際、runtime 時に plug-in を見つけることはできないのです。よって、適切な plug-in のリストを特定してあげなければならないのです。

config.ini で Eclipse runtime を設定

エラーログにあるように、config.ini は <rcpdemo-dir>\eclipse\configuration ディレクトリにあって、OSGi runtime はこのファイルを読んでいます。よってこのファイルに適切な plug-in の設定をする必要があります。

osgi.bundles=org.eclipse.core.runtime@2:start, org.eclipse.core.commands,
org.eclipse.core.expressions, org.eclipse.help, org.eclipse.jface,
org.eclipse.osgi, org.eclipse.swt.win32, org.eclipse.swt,
org.eclipse.ui.workbench, org.eclipse.ui, rcpdemo

上記は実際には1行で記述します。

起動時に毎回アプリケーションを指定しないようにするためには、config.ini に以下の設定を加えます。

eclipse.application=rcpdemo.application

もし、まだうまく起動できないようでしたら、configuration ディレクトリの config.ini 以外のファイルを消してみましょう。configuration の情報は起動を高速化するためにキャッシュされているからです。

"RCP application with a view" のテンプレートを使って RCP アプリケーション rcpview を作成して、コードを眺めてみましょう。これを参考に、rcpdemo に "File" メニューを追加して、"Exit" できるように Action を追加してみましょう。

 

いかがでしたか?Part 1 はこれにて終了です。お疲れ様でした。

 

ソースコード

このチュートリアルで作成するアプリケーションの zip ファイルは、原本サイトのこちらから取得できます。

 

おわりに

今回は Eclipse RCP に付属のテンプレートを使用した RCP アプリケーションの開発をステップを踏んで追ってみました。基本的に Wizard 形式を最大限に利用しましたが、途中あるように、RCP といっても基本は Eclipse Plug-in なのでその仕組みをきちんと理解することはとても重要になります。

Part 2 では、さらに別のアプリケーションを利用して、ヘルプの追加や更新マネージャの利用といった部分まで進んでいきます。

 

References

EclipseCon 2005, Hyatt Regency

 

Javaおよびその他のJavaを含む商標は、米国 Sun Microsystems, Inc. の商標であり、同社のJavaブランドを使用した技術を使用した製品を指します。
Windowsは、米国Microsoft Corporationの米国および その他の国における登録商標です。
Windows の正式名称は、 Microsoft(R) Windows(R) Operating System です。
記載されている製品名、会社名は、それぞれの会社の 登録商標または商標です。