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;
ただし、実行時にクラスを追加する機能を追加するための最良のアプローチは何だろうか。新しいファイルを「プラグイン」ディレクトリに追加するイベントによって、自動的に ClassLoaderとWeld コンテナに登録される。
助言がありますか?まだ考えていない落とし穴?CDI に関する私の経験はかなり限られており、おそらくこの問題には適していないかもしれません。
免責事項OSGI は、会社のライセンス ポリシーにより除外されています。その面では助けられません。