Guiceで簡易的なプラグインシステムを構築するには
Java 界隈には OSGi といういかついダイナミックモジュールシステムがあるのですけども、これは解決しようとしている問題の量が非常に多いのでちょっとしたものを作るために使おうとすると非常に辛い。
そもそも、アプリケーションのブートストラップ部分から全部 OSGi ベースで作りこまないと良い感じに動いてくれません。
そこで、OSGi を前提としたアーキテクチャ設計が必要になるのですけども、ちょっと便利なツール作りたいだけなのに膨大な時間をかけて OSGi を勉強するかと言われると、しませんよね。
という訳で、Java において簡易的なプラグインシステムを Guice で作ってみましょうという話です。
尚、Spring 界隈で実現する方法については@makingさんのエントリをどうぞ。
コードの場所
必要に応じてエントリ内にコードはありますが、実際に動作するものは GitHub 上にあります。
制限事項
ここで作るプラグインシステムでは幾つかの明確な制限事項があります。
- 単一のプロセスで動作する
- 複数のプロセスでプラグインを自律的に共有することはできない
- 単一のクラスローダを前提に動作する
- プラグインシステムとプラグインが同一のクラスローダ上にいるので、クラスパス次第ではクラス定義の乗っ取りが発生する可能性がある、つまりセキュアではない
- プラグインの追加や削除する際にプロセスを再起動しなければならない
- プラグインシステム及びプラグインの自動的なバージョンアップはできない
- プラグインシステムで定義した拡張ポイントにだけプラグインできる
- 追加されたプラグインが更に新しい拡張点を宣言することはできない、つまり、プラグインをプラグインできる仕組みではない
- 追加したプラグインの数に比例してプラグインシステムの起動時間が伸びる
- プラグインの探索を遅延評価することはできない
- GUI アプリケーションを想定しない
- plugin.xml のような自己記述的設定ファイルを持たない
もし、これらの制限事項を乗り越えたいのであれば、OSGi を学習すべきです。