Весенняя банка автозагрузка - PullRequest
8 голосов
/ 14 июля 2011

Мой проект использует простой механизм плагинов, основанный на нескольких контекстах приложения, определенных в банках плагинов.Однако, чтобы это работало, я должен включить все jar плагина в classpath.Было бы неплохо, если бы Spring мог автоматически загружать jar-файлы и содержащие их компоненты, которые, например, помещаются в подкаталог «plugins» моего проекта.

Есть ли какое-то решение для этого?


Я пошел немного дальше и попытался решить эту проблему с помощью Jar Class Loader .

Поскольку я создаю экземпляр контекста приложения Spring вручную, я могу сделать следующее:

GenericApplicationContext ctx = new GenericApplicationContext();

// Load context definitions from plugin jars
JarClassLoader jcl = new JarClassLoader();
jcl.add("plugins/");

XmlBeanDefinitionReader classPathBeansReader = new XmlBeanDefinitionReader(ctx);
classPathBeansReader.setBeanClassLoader(jcl);
classPathBeansReader.setResourceLoader(new PathMatchingResourcePatternResolver(jcl));
classPathBeansReader.loadBeanDefinitions("classpath*:META-INF/my-plugins-*.xml");

Однако это не работает.Из журнала Spring я вижу, что он не читает определение XML в банке плагина.Если я заменю нижний блок на

XmlBeanDefinitionReader classPathBeansReader = new XmlBeanDefinitionReader(ctx);
classPathBeansReader.setBeanClassLoader(jcl);
classPathBeansReader.loadBeanDefinitions(new ClassPathResource("META-INF/my-plugins-somemodule.xml",jcl));

, он найдет и загрузит файл определения XML и bean-компоненты из фляги.Однако, таким образом, я жестко связываю имя ресурса XML для одного плагина, что я не хочу.Как сделать так, чтобы сопоставление с образцом работало с JCL?

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

Возможно, вы захотите использовать OSGi в качестве механизма загрузки плагинов.

Проект с открытым исходным кодом Eclipse Virgo предоставляет среду выполнения OSGi, подходящую для вашегопроект, потому что в него встроен Spring. Virgo предлагает серверы на базе Tomcat и Jetty и отдельное ядро, которое можно использовать отдельно или для создания других типов серверов.Посетите веб-сайт Virgo, чтобы узнать о функциях и преимуществах .

OSGi имеет совершенно иной дизайн, чем вы привыкли использовать в Java.Это дает вам контролируемую изоляцию между плагинами, известными как связки , в отличие от линейного пути к классам.Пакеты соединяются вместе в графе зависимостей и поддерживают управление версиями и динамические операции жизненного цикла.

Предпочтительным способом использования пакета других возможностей пакетов является использование реестра служб OSGi.Проект Spring DM позволяет публиковать обычные компоненты Spring в реестре служб и искать их в реестре служб.Spring DM также встроен в Деву.Spring DM был подарен Eclipse как проект Gemini Blueprint .

Чтобы использовать Virgo, вы должны добавить некоторую конфигурацию Spring DM для каждого из ваших плагинов в каталоге META-INF / spring.Эта конфигурация, которая является обычным файлом конфигурации XML Spring, может ссылаться на bean-компоненты в других ваших файлах Spring и публиковать эти bean-компоненты в реестре сервисов или может предоставлять bean-компоненты для сервисов, которые ищутся в реестре сервисов, на которые затем могут ссылаться и вводитьinto, bean-компоненты в других ваших файлах Spring.

Затем вы развернете свои плагины в Virgo, используя любой из поддерживаемых механизмов.Вы можете просто отбросить их в порядке зависимости в каталог раскладки.Или же вы можете использовать консоль веб-администратора или консоль оболочки для развертывания.

В качестве альтернативы, и это, похоже, вполне соответствует вашим требованиям, вы можете разместить плагины, предоставляющие пакеты для других плагинов, в репозитории Virgo, удалив ихв репозиторий / usr, а затем разверните плагины, которые (транзитивно) зависят от плагинов репозитория, через каталог раскладки или консоль веб-администратора.Дева автоматически развернет зависимости из хранилища при развертывании зависимых плагинов.

Вы также можете сгруппировать плагины вместе либо в архиве, известном как PAR , либо храня их вРепозиторий Virgo и затем ссылка на них в XML-файле, известном как plan .Затем вы должны развернуть PAR или план, как описано выше.Вы даже можете поместить некоторые из зависимостей в хранилище Virgo и уменьшить PAR или планировать содержать только зависимые плагины.

Если вам нужна дополнительная информация о Virgo, просто спросите на форуме сообщества Virgo.

1 голос
/ 19 июля 2011

Кажется, что JCL не переопределяет ClassLoader # findResource (String)

JarClassLoader.java AbstractClassLoader.java

PathMatchingResourcePatternResolver JavaDocs состояние:

Внутренне это происходит с помощью вызова ClassLoader.getResources ()

JavaDocs для ClassLoader # getResources (String) ссылается на документацию для ClassLoader # findResource (String), которая гласит:

Находит ресурс с заданным именем. Реализации загрузчика классов должны переопределить этот метод, чтобы указать, где искать ресурсы.

Так что, хотя мой ответ основан на простом чтении нескольких документов, я бы предположил, что JCL не поддерживает это из-за того, что не переопределяет документированные методы.

Вы можете проверить это, создав подкласс JarClassLoader и реализовав findResource (String), чтобы проверить мою гипотезу.

Конечно, я могу быть совершенно не прав.

...