Динамическая загрузка и выгрузка плагинов во время исполнения программы (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 плагина.
Становятся доступны где?
Что значит выгрузка? Из classpath удалить ничего нельзя — это же параметры программы java — они либо есть, либо их нет.
Скорее всего вам нужно использовать что-то типа OSGi, либо позволяет загружать компоненты системы независимо используюя разные методики (например, разные ClassLoader).
Наследуете URLClassLoader, останется сказать откуда брать классы. При загрузке плагина создаёте новый класслоадер и заносите его в свой список доступных класслоадеров, при выгрузке — удаляете из списка.
Когда надо что то сделать ищете (уже не знаю что именно вам нужно — по имени плагина? класса?) нужный класслоадер у себя в списке и создаёте оттуда инстанс нужного класса.
Список класслоадеров держите у себя где нибудь — ServletContext или что нибудь такое