Динамически загружать пружину xml config

В момент запуска весеннего приложения я хочу отсканировать путь на компьютере, найти файлы jar и построить весенний контекст приложения из xml-файлов конфигурации внутри них. Все в порядке, чтобы добавить файл jar в путь к классам и создать ApplicationContext. Но я не могу найти никаких компонентов из нового контекста. Все необходимые зависимости доступны в файлах jar в определенном пути на компьютере (через плагин maven copier), ожидайте те зависимости, которые находятся в базовом проекте Spring (например, сама пружина). Код (на языке Котлин):

var loader = URLClassLoader(arrayOf(entry.toFile().toURL()), Thread.currentThread().contextClassLoader) ... val context = ClassPathXmlApplicationContext("classpath*:/$name")//name is xml file. I'm sure the address in classpath is right. context is not creating when the address in wrong. for example: classpath://$name val services = context.getBeanNamesForType(IService::class.java)//services is empty 

Я попробовал много других способов загрузить xml, но ни один из них не был успешным. например:

 val beans = DefaultListableBeanFactory(applicationContext) val reader = XmlBeanDefinitionReader(beans) reader.beanClassLoader = loader reader.resourceLoader = resourceLoader reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_XSD) jarFile.getInputStream(jarEntry).use { reader.loadBeanDefinitions(EncodedResource(InputStreamResource(it))) } beans.preInstantiateSingletons() 

xml внутри jar-файла выглядит следующим образом:

 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <import resource="classpath*:/xxx-logic-context.xml"/> <context:annotation-config/> <context:component-scan base-package="aa.bbb.ccc.server"/> </beans> 

Это действительно интересно: когда я определяю обычные Beans вместо использования функции сканирования пакетов, я могу получить компонент в виде кода

Большой ответ от @talex вел меня. Я установил его, установив текущий загрузчик классов:

 val loader = URLClassLoader(arrayOf(entry.toFile().toURL()), Thread.currentThread().contextClassLoader) Thread.currentThread().contextClassLoader = loader 
Intereting Posts