web-dev-qa-db-ja.com

Javaを使用してプラグインシステムを構築する最良の方法

Javaアプリケーションのプラグインシステムをどのように実装しますか?

以下を実現する使いやすい(開発者向け)システムを使用することは可能ですか?

  • ユーザーはプラグインをアプリのサブディレクトリに入れます
  • プラグインは設定画面を提供できます
  • フレームワークを使用する場合、ライセンスは商用開発と互換性がありますか?
141
Sven Lilienthal

まず、すべてのプラグインが実装する必要があるインターフェイスが必要です。

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

プラグイン作成者は、プラグインをJARファイルにバンドルする必要があります。アプリケーションはJARファイルを開き、JARマニフェストの属性またはJARファイル内のすべてのファイルのリストを使用して、プラグインインターフェイスを実装するクラスを見つけることができます。そのクラスをインスタンス化すると、プラグインは準備完了です。

もちろん、プラグインができることとできないことで制限されるように、何らかの種類のサンドボックスを実装することもできます。 2つのプラグインで構成される小さな テストアプリケーション (および ブログについて )を作成しました。そのうちの1つはローカルリソースへのアクセスを拒否されます。

102
Bombe

OSGi を使用します。

Eclipseプラグインシステムの基盤です。 Equinox はEclipseの実装(ライセンスされたEPL)であり、 Felix はApacheプロジェクトの実装(ライセンスされたApache Public License)です。

Eclipseは、OSGiがあなたが言及したポイントをカバーできる具体的な例を提供します(または、完全なEclipse/SWT/JFaceスタックが必要な場合は、 Eclipse RCP の上にアプリケーションをビルドできます)。

40
Aaron Maenpaa

1.6以降、独自のシンプルなシステムをコーディングする場合に使用できる Java.util.ServiceLoader がありました。

ただし、基本的な機能以外のものが必要な場合は、既存のフレームワークのいずれかを使用してください。

29
Pete Kirkham
16
jan

PF4J を使用します。 Web、Spring、Wicketをサポートしています。使いやすく、アプリケーションを構築します

私はOSGiに1週間取り組みました。OSGiの1週間に過ぎませんでした。最後は悪い夢のようでしたが、私は多くを学びました。

私はOSGiを動かすことができました(簡単ではありません、すべての例は時代遅れです、ネット上のすべては5つではないにしても少なくとも3年です)、私はそれが問題のために既存のプロジェクトに統合するのに深刻な問題がありましたjarマニフェスト。

要するに、マニフェストの作成に使用されるあいまいなツールはほんのわずかであり、十分に文書化されていません(BNDツールはほとんどあいまいではありませんが、Eclipseの特定のプロセス用に設計されています)。また、利用可能なOSGi情報のほとんどは、既存のデスクトップアプリケーションを持っているアプリケーション開発者向けではありません。

これにより、情報のコンテキストの多くがぼやけたり不適切になります。 Neil Bartlettのブログ投稿は最大の助けでしたが、それらでも動作するシステムを取得できませんでした(Felixチュートリアルからいくつかのコードを取得し、組み込みフレームワークをロールバックするためにそれをつなぎ合わせました)。彼が何年も前に無料で投稿した本の草稿を見つけましたが、これは素晴らしいものですが、Eclipse OSGiサポートの変更により、Eclipseの例は機能しません。

すべてのステップは大きなハードルです。後で詳細を投稿しようと思います。

13
Sean Anderson

上記の問題を解決するためにOSGiを推奨することは、非常に貧弱なアドバイスだと思います。 OSGiは「正しい選択」ですが、上記のようなシナリオでは、JPFまたは独自の最小限のフレームワークのいずれかで十分だと思います。

9
Steen

数年前、私はそのようなプロジェクトを開始し、すぐに準備ができていることを望んでいます。NetBeansやEclipseなどのプロジェクトに触発されましたが、その間に少し異なるものに変わりました。 OSGiは今では良い選択のように見えますが、私のプロジェクトと比較する機会がありませんでした。これは上記のJPFと似ていますが、同時に多くの点で異なっています。

私を動機付けた基本的な考え方は、Webアプリケーション、デスクトップアプリケーション、またはアプレット/ JWSアプリケーションを分離せずにJavaアプリケーションをできるだけ簡単に構築することです(もちろん、これはUIをカバーしていません- )コア機能として。

私はいくつかの目標を念頭に置いてプロジェクトを構築しました。

  • webアプリケーションとデスクトップアプリケーションのどちらを構築する場合でも、同じ方法でアプリケーションを起動する必要はありません。プレーンなメインメソッド、No fancy web.xml宣言(標準のWeb記述子を持つことに反対するわけではありませんが、 「サーブレット」を追加するプラグインシステムではうまくいきません-私はそれらをRequestHandler(s)と呼びます-あなたの意志で動的です)。
  • 「拡張ポイント」の周りに「拡張」をプラグインするのは簡単です。Eclipseからの何かですが、異なるアプローチです。
  • すべてのプラグインが登録されているため(XMLファイル)、アプリケーションはビルドシステムに依存せずに自己展開可能である必要があります-もちろん、Antタスクと、MoursideワールドとのリンクであるMaven MOJOがありますが、アプリケーションを呼び出して、特定の場所に自己展開するように指示します。
  • mavenから借用して、リポジトリ(Maven 1および2リポジトリを含む)からコードをダウンロードできるため、リポジトリにアクセスできる限り、アプリケーションを単一の小さなjarとしてデプロイできます(いつか便利で、基本的には、アップデート-新しいバージョンがあり、ダウンロードされており、インストールするためにあなたの許可が必要なことをあなたのウェブアプリケーションから通知されるというアイデアが好きではありませんか?.
  • システムの正常性に関する基本的なアプリケーション監視、障害発生時の電子メール通知
3
adrian.tarau