M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

EclipsepediaのとおりにしてもJFaceはうごかない

引き続きSWT周辺をしらべていて今度は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つに分割されていた:

  • org.eclipse.jface_3.10.0.v20140604-0740.jar
  • org.eclipse.jface.databinding_1.6.200.v20140528-1422.jar
  • org.eclipse.jface.text_3.9.0.v20140521-1657.jar

本当に必要な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 をクラスパスに投入することで解決できる)。