Plug-in SpyをEclipse 3.3で利用する

Eclipseプラグイン開発をする場合、サル真似ルールに従って、既存のソースコードを参考にすることは非常に重要です。例えば、あるウィザード画面を作成しようとした場合、日頃から使っているウィザード画面を思い浮かべ、「あのウィザードのソースコードを読みたいな」と思うことがよくあります。しかし、肝心のソースコードがどこにあるのか、広大なEclipseソースコードの海から見つけ出すのは非常に大変です。

このようなEclipseプラグイン開発者の悩みを大いに助ける、Plug-in SpyというプロダクトがPDEプロジェクト内で開発されています。稼働中のEclipseワークベンチにおいて、View、EditorやDialog上でALT+SHIFT+F1を押すと、その画面を実装しているクラスやそのクラスが属するプラグインのID等がポップアップ画面に表示されます。しかも、そのクラス名がリンクになっていて、そのリンクをクリックするとエディタ上にそのクラスのソースコードを開くこともできます!非常に便利です。
以下のスクリーンショットは、JDTによる新規Javaクラス作成ウィザード上でPlug-in Spyのポップアップ画面を表示させたものです。(ちなみに、私のMacではALT+SHIFT+F1がうんともすんとも言わなかったで、PreferenceでキーバインドをF1に変えました)

ところが、そんな便利なPlug-in Spy、残念ながら次期メジャーリリースEclipse 3.4向けです。Eclipse 3.4をダウンロードするか、Eclipse CVSリポジトリからチェックアウトすることで、入手することはできます。
開発者のブログによれば、Eclipse 3.3でも使用できるはずだ、とのこと。早速、Eclipse 3.3においてCVSリポジトリからPlug-in Spyが含まれるorg.eclipse.pde.runtimeをチェックアウトしたところ、上記ブログのコメントにもあるように、コンパイルエラーが発生してしまいました。しかし、それにめげることなく非常に強引な方法でソースコードを修正し、Eclipse 3.3でもPlug-in Spyを使用できるようにしました。

以下に、Plug-in SpyEclipse 3.3で使用できるようにする方法をざっくりとご紹介します。修正済みソースコードをどこかで公開しようと考えていますが、EPLライセンスとはいえ、まず開発者であるChris Aniszczyk氏に問い合わせようかと思っています。

作業の概要は以下の通りです。

  1. Eclipse CVSリポジトリからorg.eclipse.pde.runtimeをチェックアウト/エクスポート
  2. org.eclipse.pde.runtimeプロジェクト内にある、Plug-in Registry View関連のソースコードおよび拡張宣言等を削除
  3. Eclipse CVSリポジトリからorg.eclipse.pde.coreをチェックアウト/エクスポート
  4. org.eclipse.pde.internal.runtime.spy.SpyIDEUtil.javaに対し、org.eclipse.pde.coreプロジェクト内に含まれるorg.eclipse.pde.internal.core.SearchablePluginsManagerクラスのcreateProxyProject()メソッドをまるごとコピー
  5. org.eclipse pde.runtimeプロジェクトのPlug-in Dependenciesに対し、org.eclipse.jdt.launchingを追加(上記createProxyProject()内で利用)

まず、Eclipse CVSリポジトリからPlug-in Spyが含まれているorg.eclipse.pde.runtimeをチェックアウトします。チェックアウトの方法はここを参照ください。

すると、org.eclipse.pde.runtimeプロジェクトにおいてコンパイルエラーが発生してしまいます。これらを解決しなければなりません。org.eclipse.pde.runtimeプロジェクトには、Plug-in Spyの他に、稼働中のプラグインを一覧表示してくれるPlug-in Registry Viewが含まれています。このPlug-in Registry View関係のソースコードにもコンパイルエラーが発生しています。そこでまず(強引ですが)Plug-in Registry View関連のソースコードおよび拡張宣言等を削除してしまいます。具体的には、org.eclipse.pde.internal.runtime.registryパッケージを削除し、plugin.xmlにおいてPlug-in Registry View関係の拡張宣言を削除します。

残るコンパイルエラーは、org.eclipse.pde.internal.runtime.spy.SpyIDEUtil.javaにあるものだけです。ソースコードを見ると、Eclipse 3.3のorg.eclipse.pde.internal.core.SearchablePluginsManagerクラスにはcreateProxyProject()メソッドが存在しないために、おこられていることがわかります。Plug-in Spyのポップアップ表示において、クラス名をクリックするとそのクラスのソースコードをエディタに開くことができることを上述しました。これは、ワークスペースに専用のプロジェクト(ProxyProject)をPlug-in Spyが作成し、エディタに開くよう要求されたクラスが属するプラグインをProxyProject内に依存ライブラリのようにインポートすることより実現しているようです。そして、上記createProxyProject()メソッドは、そのProxyProjectを作成するメソッドです。従って、このメソッド呼びを単純にコメントアウトすることにより、とりあえずコンパイルエラーを解消しPlug-in Spyを稼働させることができます。ただし、上記のように、ポップアップ表示においてクラス名をクリックしてもそのソースコードをエディタで開くことはできません。

そこで、またもや強引に、上記createProxyProject()メソッドをまるごと上記SpyIDEUtil.java内にコピーしちゃいます。Eclipse CVSリポジトリからorg.eclipse.pde.coreプロジェクトをチェックアウト/エクスポートします。そして、同プロジェクト内から、上記createProxyProject()メソッドおよび同メソッド内で使用されているcomputeClassPath()メソッドも一緒にSpyIDEUtil.javaにコピーします。このとき、それらのメソッドのシグニチャをprivateかつstaticに変更します。
これによってコピーした上記メソッド内で多くのコンパイルエラーが出ますので、未解決のクラスをインポートしたり、メッセージ表示用外部文字列をコピーしたりします。また、org.eclipse.jdt.launching.JavaRuntimeクラスも使用するので、org.eclipse.pde.runtimeプロジェクト内のplugin.xmlをダブルクリックすることでPDEマニフェストエディタを起動し、org.eclipse.jdt.launchingプラグインを依存プラグインに追加します。

以上です。これで、強引な方法ではありますが、Eclipse 3.3でPlug-in Spyを使用可能になります。

しかし、上記の修正方法のままだと、Eclipse 3.3のorg.eclipse.pde.runtimeが無効になり、Plug-in Registry Viewが使用不可能になってしまいます。そこで私は、Plug-in Spyのみを含む独立したプラグインになるようパッケージ構成とplugin.xml/MANIFEST.MFを修正し、利用しています。Plug-in Spyは非常に便利なツールなので、みんなが使えるように、Eclipse 3.4が正式リリースされるまで、私が修正したこのプラグインをどこかに公開できればと考えています。