EclipsepediaのとおりにしてもJFaceはうごかない
SWTは非常に基本的なUIコンポーネントを提供するものだけど、このSWTを基盤としてJFaceはよりリッチなUIコンポーネント──ようするにEclipseの画面を構成する部品を提供するものらしい。
直近の関心は「Eclipseに組み込まれたテキストエディタをそこだけ抜き出して、シンプルなウィンドウに載せ換えたら、軽量なテキストエディタができあがるだろうか」ということ。お目当てはSourceViewerクラス(org.eclipse.jface. text.source.SourceViewer)。
必要なJARはどれか?
そこでEclipsepediaの記事を読むとJFaceベースのアプリ開発とは、Eclipse IDEに同梱されている一群のJARのなかからJFace関連のものをつまみ上げるところから始まるらしい(微妙・・・)。
Web上の記事を読んでいるとSWTのバイナリさえあればJFaceまで開発できそうに書いてあったりするものも見かけたけれど、公式のEclipsepediaの記事によれば以下が必須のJARであるということ:
- org.eclipse.core.commands_(version info).jar
- org.eclipse.equinox.common_(version info).jar
- org.eclipse.jface_(version info).jar
- org.eclipse.osgi_(version info).jar
- org.eclipse.ui.workbench_(version info).jar
これらのJARをpluginsディレクトリからとってくる、とある。実はworkbenchは必須ではないそうだがともかくあると便利、ということである。
しかしおそらくEclipseのバージョンの問題か、Eclipse 4.4のパッケージではpluginsディレクトリ配下のjfaceのJARは、以下の3つに分割されていた:
本当に必要なJARはどれか?
ここまではまあよいのだが、次に問題となったのが実際にSourceViewerを初期化するコードを書いて実行すると、CompositeRulerクラス(org.eclipse.jface. text.source.CompositeRuler)のクラス初期化時に以下のようなエラーが出力される点:
Caused by: java.lang.ClassNotFoundException: org.eclipse.jface.text.BadLocationException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 2 more
いうまでもなく、CompositeRulerクラスのコード内で参照されるBadLocationExceptionクラスがクラスパス内に見つからないのである。
解決先は(当たり前だけど)pluginsディレクトリのなかにあって、以下のJARをクラスパスに追加すればともかくUIの初期化は成功する:
- org.eclipse.text_3.5.300.v20130515-1451.jar
このJARについてはこちらのフォーラムの記事で知った。すくなくともJARファイル名が示すように見えるパッケージ名と、先ほどのエラーメッセージに示されていたパッケージがちがっている点には驚かされる。
けれども初期化に成功した後もSourceViewerに入力を行うと即座に異常終了する。今度のエラーメッセージもまたもやクラス定義が見つからないことによるエラー:
Caused by: java.lang.ClassNotFoundException: org.eclipse.core.runtime.Platform
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 7 more
するともはや結論は見えてくる。ようするにpluginsディレクトリ配下のJARは何もかもクラスパスに入れておいて損はない(入れておかないと大損である)ということである。身も蓋もない(もちろんこのエラー自体は org.eclipse.core.runtime_ 3.10.0.v20140318-2214.jar をクラスパスに投入することで解決できる)。