2013-03-15 3 views
1

Я хочу написать небольшое приложение 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 исключен из-за политики лицензирования компании. Не могу помочь на этом фронте.

ответ

2

Мне кажется, что то, что вы ищете, было запрошено для CDI 1.1, но очень маловероятно, чтобы он пробился даже для CDI 2.0, см. Это JIRA. Есть даже несколько альтернатив, обсуждаемых там, которые вы, возможно, захотите рассмотреть.

Простой ответ - нет, CDI не предоставляет такую ​​функциональность сам по себе. Тем не менее, предполагая, что вам удастся реализовать загрузку динамического класса самостоятельно, в среде SE тривиально просто перезапустить контейнер CDI, существенно динамически переконфигурируя ваше приложение с недавно загруженными плагинами - см. Bootstrapping CDI.

Значит, вы бы watch your /plugins directory for changes. Это, в свою очередь, вызовет загрузку динамического класса, а затем перезапуск Weld. Часть загрузки динамического класса может стать волосатой, поэтому я позволю вам понять это.

Надеюсь, это поможет.

+0

Это то, что я имел в виду, но это казалось неправильным ... но я думаю, что нет другого пути вокруг него. – javabeats

+0

@ javabeats Да, на основании того, что CDI _experts_ обсуждали на этой JIRA, я бы сказал, что это так. – rdcrng

Смежные вопросы