Dependency Visualization による依存関係の可視化

欠落している依存関係を見つける

OSGi フレームワークでは、各バンドルによって、そのバンドルが提供する依存関係と、そのバンドルが必要とする依存関係が明確に指定されますが、手作業でこれらの依存関係を見つけるのは難しい場合があります。そこで活躍するのが、Dependency Visualization ツールです。

Nikhil Mayaskar, Software Engineer, IBM

Photo of Nikhil MayaskarNikhil Mayaskar は、Pune にある IBM India Software Lab の Cognos チームで働いています。彼が経験を積み、関心を持っている分野は、Java/J2EE、OSGi、および Web テクノロジーです。developerWorks 記事および IBM Redpaper の著者でもあります。余暇は、音楽と映画鑑賞を楽しんでいます。インドの IT-BHU で、電気工学の B-Tech 学位を取得しました。



Amit Mittal, Technical Team Leader, Problem Management, IBM  

Photo of Amit MittalAmit Mittal は、Pune にある IBM India Software Lab の Cognos チームの一員です。彼の専門分野は、Java/J2EE、OSGi、そしてその他の各種開発ツールです。2002年にコンピューター・アプリケーションの修士号を取得して以来、9 年以上、ソフトウェア開発に経験を積んできました。余暇は、映画と音楽の鑑賞を楽しんでいる他、科学とテクノロジーの進歩に目を配っています。



2011年 11月 18日

皆さんは、カスタムの Eclipse プラグインやフィーチャーを別の Eclipse アプリケーションにエクスポートした場合に、そのアプリケーションでは、そのプラグインやフィーチャーが機能しなくなるという事態にこれまでどれぐらい遭遇したことがあるでしょうか?

今や、新しい環境でカスタム・プラグインのあらゆる依存関係を見つけ、そのすべてを揃えるのは簡単です。これまでは、手作業でプラグインを検証しなければなりませんでしたが、今では Eclipse インキュベーター・プロジェクトの一部となっている Eclipse の Dependency Visualization ツールが、その必要をほとんど、あるいは完全に取り除きます。この記事ではまず、欠落している依存関係の問題を詳細に検討し、この問題に対処するためのソリューションを紹介した後、プラグインの依存関係を分析するタスクをさらに容易にするために、このソリューションに加えることが可能な変更について検討します。

OSGi の恩恵

Eclipse は、ビルディング・ブロックを 1 つひとつ積み上げて大規模なアプリケーションを容易に作成できるようにし、Java やその他の言語のプログラマーがアプリケーションを開発する方法を変えました。これは新しい概念ではないとは言え、きちんと揃ったバンドルにすべての依存関係が明確に定義されていることは、多くの開発者にとってこの上ない喜びです。

OSGi (Open Services Gateway Initiative) の出現、そしてバンドルの置換/追加/削除によってアプリケーションを更新するという、その見事なメカニズムは、新たな可能性を生み出しました。今や、クライアント・マシン上で Eclipse ベースのアプリケーションを更新する作業は、Web ベースのアプリケーションを更新する場合と同じように一般的で単純なものになっています。

問題

ここで忘れてはならないのは、更新メカニズム全体を適切に機能させるために、裏では大変な作業が大量に行われているということです。私たちは、バンドルを適切なフォルダーにドロップするだけで、あらゆる Eclipse ベースのアプリケーションを更新できることはわかっていますが、その一方、依存関係についてはどうでしょう?一体何が起こっているかについて何の手掛かりも残さずに、アプリケーションが機能しなくなったり、あの恐ろしい Eclipse ロード・エラーが発生したりした経験を皆さんはどれぐらいお持ちでしょうか?

この問題は、以下の 2 つのシナリオで発生することがあります。

  • サード・パーティー・フィーチャーのインストール — 依存関係が欠落する可能性は比較的低いシナリオです。最善のシナリオでは、依存関係の欠落はリリース前に対処されますが、常にその限りではないことは明らかです。
  • ィーチャーの作成 — Eclipse には数多くの API が用意されているため、多くのプログラマーがターゲット・プラットフォームを使用していません。その場合、バンドルをエクスポートした時点で、Eclipse がエラーを示します。

エラーの原因は、新しいフィーチャーに最小限必要なバンドル (以降、「依存関係」と呼びます) を明らかにして文書化していないところにあります。

私たちは最近、プロジェクトの 1 つで SWTBot テスト・ツールを使用する計画をしているときに、このシナリオに直面しました。他の自動化テスト・ツールと同じく、SWTBot の一部がテスト対象のアプリケーション (AUT) に組み込まれていなければ、テストの自動化は機能しません。Equinox P2 の更新フィーチャーを使用して SWTBot フィーチャーをアプリケーションにインストールすれば、このフィーチャーは依存関係を処理しますが、それが可能でないことはよくあります。例えば、アプリケーションが P2 に対応していない場合などです。

しかし、(まだ) 恐れることはありません。次のセクションを読んでください。

(それほど良くはない) ソリューション

この問題をそれなりの形で解決するためには、以下の 2 つの方法があります。

  1. <Application Executable> -clean -console

    上記のコマンドによって、アプリケーションの起動中に OSGi コンソールを立ち上げます。
  2. 未解決のプラグインの依存関係を 1 つひとつ検索します。

運が良ければ、「Could not resolve bundle ABC due to missing required bundle XYZ. (必要なバンドル XYZ が見つからないため、バンドル ABC を解決できませんでした。)」という単純なエラー・メッセージが表示されます。

しかし運が悪ければ、「Could not resolve bundle ABC due to missing package XYZ. (必要なパッケージ XYZ が見つからないため、バンドル ABC を解決できませんでした。)」というメッセージが表示されます。この場合、指摘されたパッケージをエクスポートするバンドルを特定しなければなりません。

package <パッケージ名> コマンドを使ってバンドルを見つけることはできません。このコマンドは、該当するバンドルが解決されている場合にしか適用できないためです。そもそも、バンドルが解決されているとしたら、バンドルが未解決であるというエラーを受け取ることもありません。

コンソールを使用したソリューションには、さらにもう 1 つの望ましくない側面があります。例えば、ローカルでは正常に機能しているフィーチャーが、リモート・マシンでは機能しない場合を考えてみてください。そのマシンのユーザーに、コンソールを使いこなすだけの技術的な知識がないとしたらどうなるでしょう?あるいは、仮にそのマシンのユーザーが経験豊富であったとしても、ユーザーを困惑させて、開発者のスキルに疑問を抱かせるようなことを皆さんはしたくないはずです。

最後に、例えば -console オプションを直接提供できない場合のカスタム・スクリプトなど、Eclipse ベースのアプリケーションではカスタム・メカニズムを使用してカスタム・スクリプトを起動することがよくあります。

その点を念頭に置いて、より良いソリューションを検討しましょう。

より良いソリューション

前述した裏での大変な作業を大変なままにしておくことはありません。それよりも、要領良く取り組むほうが賢明です。そして、そのために役立つのが Eclipse Project です。

この記事では、Eclipse Project の Dependency Visualization ツールを使用して、ターゲット・アプリケーションを起動することなく、プラグインの依存関係を表示する方法を説明します。このツールは、アプリケーションを立ち上げる前であっても、未解決のプラグインを特定する上で役に立ちます。


Eclipse PDE プロジェクト – Dependency Visualization

: 依存関係グラフを示すための Dependency Visualization プラグインは、Eclipse バージョン 3.5.X 以上で動作します。

セットアップおよび使用法

  1. Eclipse 更新リポジトリー・フィーチャーを使用して、フィーチャーをインストールします。Eclipse で、「Help (ヘルプ)」 > 「Install New Software (新規ソフトウェアのインストール)」の順に選択し、「Work with (作業対象)」に「http://download.eclipse.org/eclipse/pde/incubator/visualization/site」を貼り付けます。「Group items by category (項目をカテゴリー別にグループ化)」チェック・ボックスのチェック・マークは外し、表示される「PDE Dependency Visualization」を選択してインストールします。

    次に、「Window (ウィンドウ)」 > 「Show View (ビューの表示)」 > 「Other (その他)」 > 「Plug-in Development (プラグイン開発)」 > 「Graph Plug-in Dependencies (プラグイン依存関係のグラフ表示)」の順に選択するか、Ctrl+3 を押して「Graph Plug-in Dependencies (プラグイン依存関係のグラフ表示)」ビューを選択します (図 1 を参照)。

    図 1. 「Graph Plug-in Dependencies (プラグイン依存関係のグラフ表示)」ビュー
    検索ウィンドウが表示されている「Graph Plug-in Dependencies (プラグイン依存関係のグラフ表示)」ビューのスクリーン・ショット
  2. 「Window (ウィンドウ)」 > 「Preferences (設定)」 > 「Plug-in Development (プラグイン開発)」 > 「Target Platform (ターゲット・プラットフォーム)」の順に選択します。<アプリケーションのインストール・ディレクトリー>/dropins および <アプリケーションのインストール・ディレクトリー>/plugins から、プラグインを組み込む Eclipse ターゲット・プラットフォームを選択してアクティブ状態に設定します。その上で、「Apply (適用)」を選択します (図 2 を参照)。
    図 2.
    「AUT_dropins_plugins」が選択された状態の「Target Platform (ターゲット・プラットフォーム)」画面のスクリーン・ショット
  3. 「Graph Plug-in Dependencies (プラグイン依存関係のグラフ表示)」ビューで右クリックし、「Focus On (フォーカス設定)」を選択します。<アプリケーションのインストール・ディレクトリー>/dropins 配下のプラグインのなかから、依存関係グラフを表示するプラグインを選択します。ここでは、org.eclipse.emf.core を選択します。

    コントロール・パネルには、3 つの依存関係分析ツールが追加された状態になっています。バンドルを選択することで、そのバンドルへの最短パス (「Show Shortest Path (最短パスを表示)」)、すべてのパス(「Show All Paths (すべてのパスを表示)」)、あるいはスマート・パス (「Show Smart Path (スマート・パスを表示)」) を強調表示することができます。「最短パス」と「すべてのパス」の意味は、その言葉どおりです。「スマート・パス」は、直接必要となるバンドルから選択されたプラグインへのすべての最短パスのことを表します。図 3 に一例を示します。

    図 3. 依存関係のスマート・パスの表示
    さまざまな依存関係のラベルが付いた、色分けされた一連のボックスのスクリーン・ショット。強調表示された要素から始まる赤い矢印は、すべての依存関係とサブ依存関係に繋がっています。
  4. プラグイン開発者がエラーを追跡して修正しやすいように、エラー・レポート・フィーチャーが追加されています。このフィーチャーは、解決できないバンドルへのパスを強調表示します (図 4 を参照)。
    図 4. 視覚的なエラー・レポート
    エラーの例のスクリーン・ショット。ポップアップ・ボックスに、「Unresolved Bundle: B (未解決バンドル: B)」および「Unresolved Bundle: D (未解決バンドル: D)」と示されています。ビューでも、これらのバンドルに対応するボックスには、エラーを示す赤い四角の X が表示されています。
  5. 検索テキスト・ボックスを使用することで、特定の文字列と一致するすべてのプラグインを強調表示することができます。この例では、org.eclipse.mylyn という文字列が含まれるすべてのバンドルが強調表示されています (図 5 を参照)。
    図 5. 視覚的な検索
    多数の依存関係がある複雑なプロジェクトのスクリーン・ショット。最上部の検索バーには「org.eclipse.mylyn」と入力されていて、レイアウト表示内の複数のボックスが、一致を示す黄色で強調表示されています。
  6. このプラグイン依存関係グラフから PNG を作成するためのスクリーン・ショット・ツールが用意されています (図 6 を参照)。
    図 6. プラグイン依存関係グラフのスナップショット
    依存関係グラフのスナップショットのプレビューのスクリーン・ショット
  7. 複数のズーム・レベルがあらかじめ定義されています。これらのズーム・レベルは、ビューのコンテキスト・メニューから選択することができます (図 7 を参照)。
    図 7. ズーム・レベルの設定
    ズーム・セレクターが開かれた状態の依存関係グラフのスクリーン・ショット。ページ・レベルから最大 400% まで、さまざまなズーム・レベルがあります。
  8. プラグイン開発者にどのバンドルが解決済みであるかを示すために、バージョン番号のビューに切り替えられるようになっています (図 8 を参照)。
    図 8. バンドル・バージョン番号のビュー
    依存関係グラフのスクリーン・ショット。各要素には、その名前と併せてバージョン番号が表示されています。
  9. 選択したプラグインを呼び出す要素と、そのプラグインによって呼び出される要素を表示するオプションもあります (図 9 を参照)。
    図 9. 呼び出し元と呼び出し先の表示
    要素の呼び出し元と呼び出し先を表示するためのボタンのスクリーン・ショット

以上で説明した機能を使用して、<アプリケーションのインストール・ディレクトリー>/dropins フォルダーから選択したプラグイン (この例では org.eclipse.emf.core) を、<アプリケーションのインストール・ディレクトリー>/dropins および <アプリケーションのインストール・ディレクトリー>/plugins フォルダーに格納されているすべてのプラグインと照らし合わせることによって、依存関係がチェックされ、エラーがレポートされます。


依存関係可視化機能の拡張

Eclipse チームの成果は賞賛に値するものの、この依存関係の可視化機能は、さらに拡張することができます。Dependency Visualization ツールは一度に 1 つのプラグインの依存関係しか表示しませんが、最初のセクションで説明したように、カスタム・フィーチャーを作成した場合には、そのフィーチャーに含まれるすべてのプラグインとバンドルが完全に解決されるかどうかを突き止めなければなりません。バンドルを個別に 1 つずつ調べるよりも、Dependency Visualization ツールにフォルダーのパスを指定して、そのフォルダーに含まれるすべてのバンドルの依存関係をまとめてチェックさせたほうが効率的です。

それとはまた別に、このツールはターゲット・プラットフォームをスキャンして MANIFEST.MF の Required Bundle セクションに記載されているプラグインを探し、見つからないプラグインをレポートします。では、未解決のインポート・パッケージについてはどうでしょう?

私たちはプラグイン依存関係の分析を大幅に単純化し、簡単に行えるようにするために、Eclipse PDE プロジェクトをベースに以上の機能を実装する簡単なコードを作成しました。この拡張について、これから詳しく説明します。

セットアップおよび使用法

  • この記事に付属の org.eclipse.pde.visualization.dependency_1.0.0.jar を Eclipse/plugins ディレクトリーにコピーしてから、Eclipse を再起動します (「ダウンロード」を参照)。
  • 「Window (ウィンドウ)」 > 「Show View (ビューの表示)」 > 「Other (その他)」 > 「Plug-in Development (プラグイン開発)」 > 「Graph Plug-in Dependencies (プラグイン依存関係のグラフ表示)」の順に選択するか、Ctrl+3 を押して「Graph Plug-in Dependencies (プラグイン依存関係のグラフ表示)」ビューを選択し、ツールを開きます。

フォルダー内のすべてのプラグインを検証する

この拡張フィーチャーにより、指定したフォルダー内に含まれるすべてのプラグインをまとめて検証することができます。このフィーチャーを使えば、プラグインごとにいちいち右クリックして「Focus On (フォーカスの設定)」を選択するといった一連の作業を省略できるため、時間の節約になります。すべての未解決バンドルについてのレポートは集約されて、1 つのレポートとして表示されます

: 「Plugins Location (プラグイン・ロケーション)」に指定するフォルダー内のプラグインは、アクティブ・ターゲット・プラットフォームにも組み込まれている必要があります (図 10 を参照)。

図 10. プラグインの場所の設定
「Plugins Location (プラグイン・ロケーション)」を「c:\Program Files\IBM\AUT\dropins」に設定した画面のスクリーン・ショット

これで「Apply (適用)」をクリックするとプラグインの検証が行われ、その結果としてビューの最上部に未解決のすべてのバンドルの一覧へのハイパーリンクが赤で表示されるはずです。図 11 では、そのハイパーリンクのところに (「32 errors detected (32 のエラーを検出)」として) 32 のエラーが検出されたことが示されています。依存関係グラフに表示されているのは、指定のフォルダーに含まれている最後のバンドルです。

図 11. 未解決バンドル数の表示
依存関係グラフのスクリーン・ショット。org.hamcrest という名前の隣に、「32 errors detected (32 のエラーを検出)」という赤いリンクが表示されています。

作成したコードは、基本的に以下の処理を行います。

  1. 指定されたフォルダー内のすべてのプラグインを調べます。
  2. プラグインごとに依存関係をチェックします。
  3. 未解決のすべての依存関係を「errors detected (エラーを検出)」のカウントに追加します。

プラグインごとの依存関係グラフを表示するには、右クリックして表示されるコンテキスト・メニューまたはツール・バー上の「Back (戻る)」と「Forward (進む)」を使用します (図 12 を参照)。

図 12. 要素ツリー内での移動
コンテキスト・メニューが開かれた状態の依存関係グラフのスクリーン・ショット。コンテキスト・メニューには、ツリー内を移動するための「Back (戻る)」と「Forward (進む)」が表示されています。

その他にも以下の機能があります。

  • バンドルのバージョンの表示
  • 依存関係パスの表示
  • 呼び出し先の表示
  • 呼び出し元の表示

これらの機能を使用する方法は、前に説明したとおりです。

未解決のインポート・パッケージのエラーをレポートする

バンドルの依存関係は、MANIFEST.MF の Dependencies セクションに含まれる Required Plug-ins に記述される場合も、Imported Packages に記述される場合もあります。バンドルが完全に解決されるのは、Required Plug-ins に記述されているプラグインと、Imported Packages に記述されているパッケージをエクスポートするバンドルを入手できた場合のみです。Eclipse PDE プロジェクトでレポートするエラーは、Required Plug-ins に記述されている必須プラグインがないというエラーのみで、未解決のパッケージについてのエラーはスキップされてしまいます。

私たちは、選択したバンドルでの未解決のインポート・パッケージ (およびそのバージョン) も表示されるように変更しました (図 13 を参照)。

  • エラーの一覧には、欠落しているすべての必須プラグインが最初に記載された後、未解決のパッケージが続きます。
  • インポート・オプションはスキップされます。
図 13. 未解決のインポート・パッケージのエラー
エラーの一覧が展開された状態の依存関係グラフのスクリーン・ショット。この一覧には個々のエラーが示されています。

「フォルダー内のすべてのプラグインを検証する」のセクションで説明したフィーチャーを使用している間は、指定したフォルダー内のすべてのプラグインについてのエラー・レポートには欠落している必須プラグインだけが含まれ、未解決のインポート・パッケージは含まれないことに注意してください。

欠落しているインポートの詳細は、個々のプラグインごとに提供されます。それぞれのプラグインの情報を表示するには、右クリックして表示されるコンテキスト・メニューまたはツール・バー上の「Back (戻る)」と「Forward (進む)」を使用してください。さらに変更を加えれば、この機能をフォルダー・レベルで組み込むことも可能です。その上で、包括的なログ・ファイルを生成したり、単にコンソール上に表示したりするように拡張することができます。

いずれの場合にしても、未解決のインポート・パッケージはエラー・レポートにのみ表示され (赤いリンク)、グラフには表示されません。このツールには、その未解決パッケージをエクスポートするプラグインについて知る手掛かりがないためです。

この場合も同じく、他に以下の機能があります。

  • バンドルのバージョンの表示
  • 依存関係パスの表示
  • 呼び出し先の表示
  • 呼び出し元の表示

これらの機能を使用する方法は、前に説明したとおりです。


制約事項および陥りやすい落とし穴

  • このツールが分析するのは、プラグインの依存関係だけです。フラグメントの依存関係は分析できません。
  • このツールは、特定のプラグインをアクティブなターゲット・プラットフォームで記載されている他のプラグインと照らし合わせて検証するだけです。欠落している必須プラグインや未解決のインポートに対する解決法を提案する手段はありません。
  • コードは、IBM JRE バージョン 1.5 でコンパイルおよびテストしました。

まとめ

この記事では、Eclipse PDE で提供している Dependency Visualization ツールと併せ、プラグインの依存関係分析タスクに役立つ一連のビューを提供することを目的としたカスタム変更を紹介しました。開発者がプラグインの間での依存関係を理解しようと取り組む際には、特にビューが開発者の認識を深める助けとなります。


ダウンロード

内容ファイル名サイズ
org.eclipse.pde.visualization.dependency_1.0.0.jarorg.eclipse.pde.visualization.dependency_1.0.0.jar741KB

参考文献

学ぶために

  • Eclipse IDE プロジェクトの記事およびチュートリアルのライブラリー: IDE 開発に関する記事およびチュートリアルを包括的に揃えたリストを参照してください。製品、タイトル、トピック、またはキーワードを基準にリストを検索して、検索結果をソートできます。
  • Twitter での developerWorks: developerWorks をフォローして最新ニュースを入手してください。
  • developerWorks Open source ゾーン: 開発や IBM 製品でオープンソース技術を使用する際に役立つ広範なハウツー情報、ツール、およびプロジェクト更新を見つけてください。
  • 興味深いイベント: 世界中で近日中に予定されている IBM オープンソース開発者を対象とした会議、見本市、ウェブキャストをチェックしてください。
  • developerWorks podcasts: ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
  • developerWorks オンデマンド・デモ: 無料のオンライン・デモで、IBM およびオープンソースの技術と製品機能を試してみてください。

製品や技術を入手するために

議論するために

  • developerWorks コミュニティー: ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。developerWorks コミュニティーで、Real world open source グループの構築を手伝ってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=773521
ArticleTitle=Dependency Visualization による依存関係の可視化
publish-date=11182011