EclipseCon 2008に思うこと(その1:Eclipse RT)

サンタクララではEclipseCon 2008が開催されていますね。行きたかったな。来年こそは!という気分です。

さて、今年のEclipseCon 2008ではEclipseがミドルウェアに進出!みたいなアナウンスメントが流れているようですが、これって以前からアナウンスされているRCP(Rich Client Platform)、RSP(Rich Server Platform)、eRCP(embeded Rich Client Platform)などEquinox関連の技術を再度プッシュっていうことなんだと思いました。(各所のニュースサイトを斜め読みしただけなので、実際のところはどうなのかよく分かってない;-)要するに、EclipseはただのIDEじゃないんだぞ、ランタイム環境としても面白い技術なんだぞという主張のように取れました。実際面白いんですが、dzoneの記事のEclipse Equinox - Fulfilling the Promise of Write Once Run Anywhere | Javalobbyは言い過ぎかなと思いました。確かにMSのターゲットプラットフォームはMS製品のみだと言う点はそうですし、OSGiもランタイムレイヤに含めて考えることはできますが、今のところJavaの実装なので、Java Runtime Environmentがなきゃなんともならんぞという気がしました。*1

ただ、単一バイナリでいろいろな環境で動くアプリケーションを作る選択肢として、JREだけじゃ力不足という面があることはいなめません。特に、環境ごとにネイティブコードを呼び出す時にはJNIを使われますが、PATHが通されてないと呼び出せません。これって開発側もユーザー側も面倒じゃないでしょうか。
OSGiを使うとFragmentという単位で環境ごとの差分配布ができます。EclipseSWTなんかはそれを使って環境ごとの差分を吸収しています。eRCPが実現できているのもFragmentのおかげです。

また、Equinoxのおかげでサーバーを組み込んだアプリケーションの配布がとってもやりやすくなりました。Eclipseの中では3.3以前はTomcat、3.3からはJettyが同梱され、ヘルプシステムのAPサーバーとして稼働しています。DBサーバーもDerbyなんかを組み込んだプラグインもあるでしょう。もちろんクラスパスを通しておいて配布する形のアプリケーションもありますが、変更の容易性はEquinoxを使っている場合の方が高いと思います。クラスパス(ライブラリ)の変更をしなくたって、ロードしているサービスを別の物へ切り替えれば済む話ですから。

ただ、実際にEquinoxを使ってOSGiアプリケーションを組もうと思ってやってみると、Bundleの分割に相当苦労します。OSGiのよさには必要に応じてコンポーネントのロードができるって言うのと、コンポーネントの使いまわしができるっていうことがあります。が、コンポーネントの再利用を考えながらアプリケーションを組むなんていう経験はなかなかつめるもんじゃないんじゃないかと思います。作っていく分には楽しいんですけれども、やっぱり置くべきじゃないところにクラスを置いてしまったり、はまりやすいんですよね。クラスのリファクタと同じで、必要になったら分割するという指針でやった方がうまくいくんじゃないでしょうか。設計時に分けておいても実装していくと置くべきじゃないところに置いちゃって、クラスのロードがうまくいかないなんていう失敗は無駄な時間を費やしちゃうだけですからね。

*1:JREはSunのものとは限りませんが。