Я хотел бы разрешить пользователям добавлять/обновлять/обновлять/удалять модули в основном проекте без необходимости перезапуска или повторного развертывания. Пользователи смогут создавать собственные модули и добавлять их в основной проект.
Технически, модуль будет JAR, который может быть "горячим" и может содержать:
- spring контроллеры
- услуги, ejbs...
- ресурсы (jsps, css, images, javascripts...)
Итак, когда пользователь добавляет модуль, приложение должно регистрировать контроллеры, службы, ejbs и ресурсы карты как предназначенные. Когда он удаляет, приложение выгружает их.
Легко сказать. На самом деле это гораздо труднее сделать.
В настоящее время я сделал это с помощью Servlet 3.0 и web-fragment.xml. Основная проблема заключается в том, что я должен передислоцировать каждый раз, когда я обновляю модуль. Мне нужно избегать этого.
Я прочитал некоторые документы об OSGi, но я не понимаю, как я могу связать его с моим проектом ни тем, как он может загружать/выгружать по требованию.
Может ли кто-нибудь привести меня к решению или идее?
Что я использую:
- Glassfish 3.1.2
- spring MVC 3.1.3
- spring Безопасность 3.1.3
Спасибо.
EDIT:
Теперь я могу сказать, что это возможно. Вот как я это сделаю:
Добавить модуль:
- Загрузите module.jar
- Обращайтесь к файлу, разверните его в папке с модулем
- Закрыть контекст приложения Spring
- Загрузите JAR в пользовательский загрузчик классов, где parent - это WebappClassLoader
- Скопируйте ресурсы в основной проект (возможно, можно будет найти альтернативу, надеюсь, но в настоящее время это должно работать)
- Обновить контекст приложения Spring
Удалить модуль:
- Закрыть контекст приложения Spring
- Отвяжите пользовательский загрузчик классов и отпустите его в GC
- Удалить ресурсы
- Удалите файлы из папки модулей + jar, если они сохранены
- Обновить контекст приложения Spring
Для каждого Spring необходимо сканировать другую папку, чем
domains/domain1/project/WEB-INF/classes
domains/domain1/project/WEB-INF/lib
domains/domain1/lib/classes
И это действительно моя текущая проблема.
Технически я нашел PathMatchingResourcePatternResolver
и ClassPathScanningCandidateComponentProvider
. Теперь мне нужно сказать им, чтобы они сканировали определенные папки/классы.
В остальном я уже провел несколько тестов, и он должен работать по назначению.
Одна точка, которая будет невозможна: ejbs в банке.
Я опубликую некоторые источники, когда бы сделал что-то полезное.