Javaアプリケーション用のプラグインシステムをどのように実装しますか?
次のことを実現する(開発者にとって)使いやすいシステムを持つことは可能ですか?
- ユーザーはプラグインをアプリのサブディレクトリに配置します
- プラグインは設定画面を提供できます
- フレームワークを使用する場合、ライセンスは商用開発と互換性がありますか?
Javaアプリケーション用のプラグインシステムをどのように実装しますか?
次のことを実現する(開発者にとって)使いやすいシステムを持つことは可能ですか?
まず、すべてのプラグインが実装する必要があるインターフェースが必要です。
public interface Plugin {
public void load(PluginConfiguration pluginConfiguration);
public void run();
public void unload();
public JComponent getConfigurationPage();
}
プラグインの作成者は、プラグインを JAR ファイルにバンドルする必要があります。アプリケーションは JAR ファイルを開き、JAR マニフェストの属性または JAR ファイル内のすべてのファイルのリストを使用して、プラグイン インターフェイスを実装するクラスを見つけることができます。そのクラスをインスタンス化すると、プラグインの準備が整います。
もちろん、何らかのサンドボックスを実装して、プラグインができることとできないことを制限することもできます。私は、2 つのプラグインで構成される小さなテスト アプリケーションを作成しました(そしてそれについてブログを書きました)。そのうちの 1 つはローカル リソースへのアクセスが拒否されています。
OSGiを使用します。
これは、Eclipse プラグイン システムの基盤です。Equinoxは Eclipse の実装 (ライセンスされた EPL) であり、Felixは Apache Project の実装 (ライセンスされた Apache Public License) です。
Eclipse は、OSGi があなたが言及した点をカバーできる具体的な例を提供します (または、完全な Eclipse/SWT/JFace スタックが必要な場合は、 Eclipse RCPの上にアプリケーションを構築することもできます)。
1.6 以降、独自の単純なシステムをコーディングする場合に使用できるjava.util.ServiceLoaderがあります。
ただし、基本的な機能以上の機能が必要な場合は、既存のフレームワークのいずれかを使用してください。
JPF(Javaプラグインフレームワーク)もあります。
私は OSGi に 1 週間取り組みました。最後は悪い夢のようでしたが、多くのことを学びました。
私は OSGi を動作させることができました (簡単ではありません。すべての例が古くなっています。ネット上のすべての情報は 5 年でなくても少なくとも 3 年以上前のものです)。瓶が現れます。
要するに、マニフェストの作成に使用される不明瞭なツールはわずかしかなく、十分に文書化されていません (BND Tools はほとんど不明瞭ではありませんが、Eclipse の特定のプロセス用に設計されています)。また、利用可能な OSGi 情報のほとんどは、既存のデスクトップ アプリケーションを持つアプリケーション開発者を対象としていません。
これにより、情報の多くのコンテキストが曖昧または不適切になります。Neil Bartlett のブログ記事は最大の助けになりましたが、それらの記事でさえシステムを動作させることができませんでした (私は Felix チュートリアルからいくつかのコードを取得し、それをつなぎ合わせて組み込みフレームワークを動かしました)。彼が何年も前に無料で投稿した彼の本のドラフトを見つけましたが、これは素晴らしいものですが、Eclipse OSGi サポートの変更により、Eclipse の例は機能しません。
上記の問題を解決するためにOSGiを推奨することは、非常に貧弱なアドバイスだと思います。OSGiは「正しい選択」ですが、上記のようなシナリオでは、JPFまたは自家製のミニマルなフレームワークのいずれかで十分だと思います。
何年も前に、私はそのようなプロジェクトを開始しました。すぐに準備が整うことを願っています.NetBeans や Eclipse などのプロジェクトに触発されましたが、その間に少し違うものに変わりました. OSGi は今では良い選択のように見えますが、自分のプロジェクトと比較する機会がありませんでした。上記の JPF と似ていますが、同時に多くの点で異なります。
私を動機づけた基本的な考え方は、Web アプリケーション、デスクトップ アプリケーション、またはアプレット/JWS アプリケーション (もちろん、これは UI をカバーしていませんが、まだ) をコア機能として分離せずに、Java アプリケーションをできるだけ簡単に構築することです。
私はいくつかの目標を念頭に置いてプロジェクトを構築しました。