динамически загружать банки и выполнять в них произвольный код - PullRequest
0 голосов
/ 06 августа 2011

У меня есть консольное приложение Java, которое я пишу, и я хочу, чтобы люди могли писать плагины для него, а затем распространять эти плагины в виде jar-файлов.Я хочу, чтобы пользователи могли поместить плагин (jar) в папку «plugins», перезапустить приложение и загрузить и запустить плагин.Я не хочу, чтобы пользователю приходилось указывать класс / метод для выполнения для плагина или чего-то подобного.

Я могу загрузить банки с подстановочным символом classpath в каталог "plugins", но мне нужнокаким-то образом эти плагины могут зарегистрироваться в приложении, запустив метод register(), который каждый плагин должен где-то определить.Как плагин (jar) может указать, где (пакет и класс) определен его метод register(), так что мое приложение будет знать, как его вызвать?

Я понимаю, что OSGi может это сделать, но это довольно малоприложение, и я предпочел бы не использовать OSGi, если существует более простое решение.

Справочная информация:

Эти плагины регистрируют события из приложения, которое они хотят обрабатывать.Пользователь сможет отключить обработку определенных событий для каждого плагина, поэтому конфигурация для этих плагинов будет сохранена в базе данных приложения.Когда плагин регистрируется сам, приложение проверит базу данных, чтобы увидеть, существует ли конфигурация для этого плагина, и если нет, то создаст новую конфигурацию по умолчанию для него в базе данных.

Ответы [ 3 ]

2 голосов
/ 06 августа 2011

Определите файл манифеста для вашего приложения, который стандартизирует это поведение. Вы можете реализовать его в виде файла свойств, XML или любого другого формата, который вы выберете. Файл манифеста будет содержать стандартное имя свойства, значение которого является «классом запуска» для плагина. Попросите пользователей расширить этот класс запуска из интерфейса или заданного вами абстрактного класса, чтобы вы могли применять ожидаемое поведение (иначе говоря, иметь метод 'register').

Конечный пользователь затем объединяет свои файлы классов и манифест в JAR и распространяет его в папке подключаемых модулей вашего приложения.

OSGI определенно подходит для этого, вы смотрели на Консьерж ? Это смехотворно мало в развернутом размере.

0 голосов
/ 01 ноября 2011

Есть еще один поток, который может оказаться полезным

Как динамически загружать Jars во время выполнения?

Также попробуйте заглянуть в Загрузчик классов Jar

0 голосов
/ 06 августа 2011

Предположительно, ваш метод регистрации является частью интерфейса Plugin?

Если это так, вы можете реализовать собственный ClassLoader для обнаружения классов, реализующих этот интерфейс.Затем используйте подход на основе прослушивателя, чтобы уведомить любой объект, который управляет вашими плагинами, о присутствии классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...