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


145

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

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

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

回答:


107

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

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

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

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


2
あなたが言及するサンドボックスは、実際には最も難しい部分です!しかし、心配する必要はありません-上記のように、osgiはすでにあなたのためにそれを行います。
ちー

1
サンドボックス化はそれほど難しくありません。正しく実行する方法を見つけるのに約2週間かかりましたが、それがかなり簡単だとわかったら、:)
ボンベ

@Bombeこのサンプルアプリケーションはまだどこかにありますか?
ataulm 2012年


@ timberwo7vesどういう意味かわかりません。ファイルテストアプリケーションは、投稿で指定された場所から、およびあなたが言及したページからもダウンロードできます。
Bombe

41

OSGiを使用します。

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

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


4
私はOSGiを試してみましたが、そのための本当に優れた入門書を見つけたことはありません。誰かがここにいくつかのリンクをお勧めできたら素晴らしいでしょう。
ブライアンマシューズ

1
私は自分のアプリケーションに春分を埋め込み、標準のOSGi手法を使用して、OPが望むことを正確に実行しました。スイングでもSWTではありません。Webstartedも。適切な開始リソース:neilbartlett.name/blog
basszero

3
OSGiは、事実上、事実上のプラグインシステムです。しかし、OSG​​iのプログラミングモデルに標準のJavaからの飛躍が...かなり広いです
Hendy Irawan

30

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

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


16

ここでJPFを使用した人はいますか?おもしろそうです

1
JabRefはプラグインにJPFを使用します。かなりうまくいきます。
koppor

私はJPFを使用していますが、Antと密接に結合しています。私はそれを取り除きたいのですが、それが私のアプリケーションにどれほどの影響を与えるかわかりません。
MartinL 2013年

オープンソース製品(OpenEMM)用のJPFプラグインを作成しました。私はmaven(maven-assembly plugin)でそれを作ることができました。確かに、今でも開発の単純さには本当に感謝しています。もっと人気があるのはおそらくOSGIでしょう。
рüффп

JPFを使用するためのJavaバージョンに制限はありますか?
Madhav

16

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


私はこれが私が必要とするものであると
思い

githubでDecebalに質問してください。彼はあなたを助けます
ダニエル・ジパ

Decebalsアカウントのステータスについてはmeta.stackoverflow.com/questions/376686/…をご覧ください
Wolfgang Fahl

1
pf4jを参照している場合は、github.com/hank-cp/sbpも確認してください。これは、完全なWebアプリケーションを構築するためにSpring Bootをサポートするためにpf4jの上に構築されています。
ハンク、

13

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

OSGiを機能させることはできました(簡単ではない、すべての例は古く、ネット上のすべてが5年ではなくても3年以上古い)が、既存のプロジェクトに統合するのに深刻な問題がありました。 jarマニフェスト。

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

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

すべてのステップが大きなハードルです。詳細は後ほどここに投稿してみます。


17
これはどのように答えますか?それはOSGiについての怒りのより多くであり、あなたはOSGiが何であるかさえ説明していません。
Stealth Rabbi

@StealthRabbiこの "回答"の時点、およびその後しばらくの間、OSGiを実際に使用して作業する人にとっては、良い情報でした。OSGiはすでにディスカッションの一部でした。そのため、OSGiを定義する必要はありませんでした。これは、1週間の作業を節約できた可能性があるという答えです。
Sean Anderson

9

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


3

数年前に私はそのようなプロジェクトを開始し、すぐに準備ができていることを願っています。OSGiは良い選択のように見えますが、自分のプロジェクトと比較する機会がありませんでした。これは、上記のJPFと似ていますが、同時に多くの点で異なります。

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

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

  • Webアプリケーションを構築するかデスクトップアプリケーションを構築するかは問題ではありません。アプリケーションを同じ方法で開始する必要があります。プレーンなメインメソッドで、派手なweb.xml宣言はありません(標準のWeb記述子を使用することに反対しているわけではありませんが、 「サーブレット」を追加するプラグインシステムではうまく機能しません-私はそれらをRequestHandler(s)と呼びます-自由自在です)。
  • 「拡張ポイント」の周りに「拡張」をプラグインするのは簡単です。Eclipseからのものですが、別のアプローチです。
  • 自己展開可能、すべてのプラグインが登録されているため(XMLファイル)、アプリケーションはビルドシステムに関係なく自己展開可能でなければなりません。もちろん、私たちの世界とのリンクであるAntタスクとMaven MOJOがありますが、アプリケーションを呼び出し、特定の場所に自己展開するように指示します。
  • Mavenから借用したもので、リポジトリ(Maven 1および2リポジトリを含む)からコードをダウンロードできるため、リポジトリにアクセスできる限り、アプリケーションを単一の小さなjarとしてデプロイできます(便利な場合があり、基本的にこれは自動サポートを提供します)更新-新しいバージョンがあり、それがダウンロードされ、それをインストールするためにあなたの許可が必要なだけであることが、Webアプリケーションによって通知されるというアイデアが気に入りませんか?私はそれが大好きです)。
  • システムヘルスに関する基本的なアプリケーション監視、障害発生時の電子メール通知

2
口論するつもりはありませんが、それ以来取り組んでいますか?コードは利用できますか(そのまま使用することも、追加することもできます)?
Piccolo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.