Cargue la configuration xml del muelle de forma dinámica

En el momento del inicio de una aplicación de spring, quiero escanear un path en la computadora, encontrar los files jar y crear un context de aplicación de spring a partir de los files de configuration xml dentro de ellos. Todo está bien para agregar el file jar al classpath y hacer un ApplicationContext. Pero no puedo encontrar frijoles del nuevo context. Todas las dependencies necesarias están disponibles en los files jar en la ruta específica en la computadora (a través de un plugin de copydora maven) esperan aquellas dependencies que están en el proyecto de resorte base (por ejemplo, la dependencia de la spring en sí). El código es (En lenguaje Kotlin):

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 

He intentado muchas otras maneras de cargar el xml pero ninguno de ellos fue exitoso. por ejemplo:

 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() 

el file xml dentro de jar se ve así:

 <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> 

Es realmente interesante: cuando defino Beans regulares en lugar de utilizar la function de escaneo de packages, puedo get el bean en una especie de código