Я хочу написать небольшое приложение SE для запуска команд, специфичных для ОС. Эти команды поставляются в основное приложение в виде «плагинов», чтобы иметь возможность добавлять новую командную реализацию во время выполнения. Это обязательный запрос: чтобы повторное развертывание основного приложения не потребовалось для запуска новых плагинов.Как написать приложение с возможностью подключения с помощью CDI (сварка)?
Итак, я пошел о попытке установки что-то с помощью 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);
}
Реализация плагин будет что-то вроде этого (в отдельной баночке):
@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));
}
}
И это прекрасно работает, при загрузке с использованием следующей точки впрыска плюс один вызов():
@Inject @Any Instance<Pluggable> plugin;
Однако, мне интересно что лучший способ добавить возможность добавлять классы во время выполнения, чтобы событие добавления нового файла в каталог «плагины» автоматически регистрировало его на ClassLoader и контейнере Weld.
Любые предложения? Ловушки, которые я еще не рассматривал? Мой опыт работы с CDI довольно ограничен, и, возможно, он не может быть подходящим выбором для этой проблемы.
Отказ от ответственности OSGI исключен из-за политики лицензирования компании. Не могу помочь на этом фронте.
Это то, что я имел в виду, но это казалось неправильным ... но я думаю, что нет другого пути вокруг него. – javabeats
@ javabeats Да, на основании того, что CDI _experts_ обсуждали на этой JIRA, я бы сказал, что это так. – rdcrng