В Java я могу динамически добавлять элементы в путь к классам и загружать классы («динамически» означает без перезапуска моего приложения). Есть ли известный фреймворк / библиотека, которая занимается динамической загрузкой / выгрузкой модулей без перезапуска?
Обычная настройка, особенно для веб-приложений, - это балансировка нагрузки, несколько экземпляров приложения и постепенное развертывание и перезапуск новой версии. Я ищу что-то другое - приложение с несколькими службами / плагинами, возможно, настольное приложение с одним экземпляром, где отключение одной службы обходится дешево, но отключение или перезапуск всего приложения невозможно.
Я думаю о типичной инфраструктуре плагинов, где плагины можно обновлять или устанавливать без перезапуска приложения. Мне нужно программировать это с нуля, или что-то уже доступно? Совместимость с Spring и открытый исходный код - это плюс, но не требование.




Вы можете рассмотреть возможность запуска вашего весеннего приложения в Фреймворк OSGI.
Я считаю, что DMServer - это модульный сервер приложений Java, который предназначен для запуска корпоративных приложений Java и приложений на основе Spring, основанных на OSGI.
Вы можете найти более подробную информацию в этой статье Здравствуйте, OSGi, часть 2: Введение в динамические модули Spring, в частности, как использовать Spring DM для динамической установки, обновления и удаления модулей в работающей системе.
Примечание: когда вы говорите о том, что «плагины можно обновлять или устанавливать без перезапуска приложения», OSGI - это первая подходящая среда, которая приходит на ум.
Все дело в модульном разделении приложений на более мелкие пакеты. Каждый пакет представляет собой тесно связанную, динамически загружаемую коллекцию классов, jar-файлов и файлов конфигурации, которые явно объявляют свои внешние зависимости. (если есть).
Возможно, самый простой подход - загрузить каждый плагин собственным загрузчиком классов. Затем откажитесь от загрузчика классов и создайте новый, чтобы перезагрузить плагин. Вам понадобятся методы init () и destroy () в API плагина, чтобы обеспечить возможность функциональности типа запуска / завершения.
Это также имеет то преимущество, что плагины изолированы друг от друга.
URLClassLoader - ваша отправная точка для этого. Общая идея заключается в том, что вы предоставляете суперкласс XxxPlugin, который является подклассом любого плагина. Рассмотрим пример Applet, который по сути является плагином GUI (или Midlet и т. д.).