Задать вопрос

Динамическая загрузка и выгрузка плагинов во время исполнения программы (Java)?

Что сейчас есть:

1) Программа на Java, которая использует Jetty Embedded и висит на определенном порту

2) Плагины к этой программе: набор Java классов в пакетах (они распространяются в jar-файлах без библиотек)


Идея:

На главный сервлет поступает команда включить (выключить) плагин. Выполняет нужный метод: при включении все классы jar-файла плагина становятся доступны, при выключении — обратная ситуация.


Что удалось нагуглить?


Про classpath: что при включении можно расширить classpath на классы в Jar'e плагина.

Про динамическую загрузку классов: с помощью своего class loader.


Вопросы:

Реализуема ли идея, путем простой модификации classpath или нет?

Если да, то как будет выглядить выгрузка (то есть удаление путей из classpath)?

Если нет, то есть ли какие-нибудь особенности в реализации Class Loader из Jar файлов.

Как быть с выгрузкой (везде написано, что классы «выгружает» Garbage Collector (но, насколько я помню, GC нельзя вызвать самому, его вызывает JVM, когда нужно).

Тогда еще вопрос: как сделать ситуацию «когда нужно» для классов, которые в Jar'e плагина.


Заранее спасибо.
  • Вопрос задан
  • 4677 просмотров
Подписаться 4 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 2
javax
@javax
Software Architect, Java Developer since 1996
Наследуете URLClassLoader, останется сказать откуда брать классы. При загрузке плагина создаёте новый класслоадер и заносите его в свой список доступных класслоадеров, при выгрузке — удаляете из списка.

Когда надо что то сделать ищете (уже не знаю что именно вам нужно — по имени плагина? класса?) нужный класслоадер у себя в списке и создаёте оттуда инстанс нужного класса.

Список класслоадеров держите у себя где нибудь — ServletContext или что нибудь такое

В сети есть не мало статей на эту тему
Ответ написан
Комментировать
Что бы гибко управлять плагинами лучше использовать OSGi, как тут уже советовали.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы