Динамически загружаемые и выгружаемые модули приложений в Java - как? - PullRequest
4 голосов
/ 30 марта 2011

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

Простые * .jar файлы в порядке, но как только они загружены, я полагаю, я не могу выгрузить их изВМ и замена на другую версию на лету.

Какой подход вы можете предложить?

Ответы [ 5 ]

4 голосов
/ 06 апреля 2011

Похоже, OSGi - это именно то, что вы просите.Это может быть сложно, но есть способы справиться с этим.Некоторая сложность может быть уменьшена с помощью SpringDM или чего-то подобного для решения стандартных задач регистрации и использования сервисов во время выполнения.Регистрация служб, управляемая аннотациями, и внедрение зависимостей действительно сокращают объем кода, который необходимо написать.

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

Я бы посоветовал взглянуть на книгу «OSGi в действии», чтобы получитьсмысл вопросов и увидеть некоторые достойные образцы.

2 голосов
/ 30 марта 2011

По крайней мере, вам потребуется определить свой собственный загрузчик классов ... Я не понимаю, как это может быть проще, чем просто использовать Felix, Equinox, Knoplerfish или любую среду исполнения Osgi с открытым исходным кодом для выполнения этой задачи. Может быть, SpringDM проще ...

1 голос
/ 30 марта 2011

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

1 голос
/ 30 марта 2011

То, что вы собираетесь, определенно возможно. Я считаю, что вы можете выгрузить классы из памяти, загрузив их в отдельный ClassLoader, а затем избавившись от этого ClassLoader. Если вы не хотите полностью использовать OSGI, я бы порекомендовал что-то вроде JBoss Microcontainer (http://www.jboss.org/jbossmc) или ClassWorlds (http://classworlds.codehaus.org/).). Не так уж сложно написать что-то подобное с нуля, если ваши потребности достаточно специализированы. .

Надеюсь, это поможет, Nate

0 голосов
/ 30 марта 2011

OSGi не так сложен - с помощью PAX runner с Maven работал как ветер.

Или реализуйте свой собственный ClassLoader и установите его в JVM: java -Djava.system.class.loader = com.test.YourClassLoader App.class

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