1

OS 固有のコマンドを実行する小さな SE アプリケーションを作成したいと考えています。これらのコマンドは、実行時に新しいコマンド実装を追加できるようにするために、「プラグイン」としてメイン アプリケーションに提供されます。これは必須の要求です。新しいプラグインを実行するためにメイン アプリケーションを再デプロイする必要はありません。

それで、CDIを使用して何かをセットアップしようとしました:

// On a common dependency 
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Plugin {
    String value();
}

public interface Pluggable {
    void execute(PluginContext context);    
} 

プラグインの実装は次のようになります (別の jar 内):

@Plugin("greeting")
public class GreetingPlugin implements Pluggable {
    public void execute(PluginContext context) {
        String greet = context.get("hello.world");
        System.out.println(String.format("Hello, %s", greet));
    }
}

そして、次のインジェクション ポイントと select() 呼び出しを使用してロードすると、正常に動作します。

@Inject @Any Instance<Pluggable> plugin;

ただし、実行時にクラスを追加する機能を追加するための最良のアプローチは何だろうか。新しいファイルを「プラグイン」ディレクトリに追加するイベントによって、自動的に ClassLoaderWeld コンテナに登録される。

助言がありますか?まだ考えていない落とし穴?CDI に関する私の経験はかなり限られており、おそらくこの問題には適していないかもしれません。

免責事項OSGI は、会社のライセンス ポリシーにより除外されています。その面では助けられません。

4

1 に答える 1

2

あなたが探しているのは CDI 1.1 で要求された機能であるように思えますが、CDI 2.0 でさえも機能する可能性はほとんどありません。このJIRAを参照してください。そこでは、検討したい代替案がいくつか議論されています。

簡単な答えは - いいえ、CDI 自体はそのような機能を提供していません。とはいえ、自分で動的クラス ロードを実装できると仮定すると、SE 環境では、CDI コンテナを再起動して、新しくロードされたプラグインでアプリケーションを基本的に動的に再構成するのは簡単です - CDI のブートストラップを参照してください。

したがって、ディレクトリの変更を監視します/plugins。これにより、動的なクラスのロードがトリガーされ、次に Weld の再起動がトリガーされます。動的なクラスの読み込み部分は複雑になる可能性があるため、理解してもらいます。

お役に立てれば。

于 2013-03-16T03:04:05.667 に答える