Я пытаюсь загрузить компоненты Spring в мой контекст после загрузки файла JAR во время выполнения.В настоящее время я использую наивный подход
public Class<?> loadAllJarClasses(String pathToJar, String mainClassName) {
Class<?> clazz = null;
Class c;
try {
JarFile jarFile = new JarFile(pathToJar);
Enumeration<JarEntry> e = jarFile.entries();
URL[] urls = { new URL("jar:file:" + pathToJar + "!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls);
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
if (je.isDirectory() || !je.getName().endsWith(".class")) {
continue;
}
// -6 because of .class
String className = je.getName().substring(0, je.getName().length() - 6);
className = className.replace('/', '.');
logger.info("loading " + className);
c = cl.loadClass(className);
if (c.getAnnotation(org.springframework.stereotype.Component.class) != null
|| c.getAnnotation(org.springframework.stereotype.Service.class) != null) {
resgisterBean(c);
logger.info("registered bean for " + c.getName());
}
if (className.equalsIgnoreCase(mainClassName)) {
clazz = c;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return clazz;
Функция RegisterBean
public void resgisterBean(Class<?> clazz) {
beanFactory = (BeanDefinitionRegistry) ((ConfigurableApplicationContext) ctx).getBeanFactory();
beanFactory.registerBeanDefinition(clazz.getName(),
BeanDefinitionBuilder.genericBeanDefinition(clazz).getBeanDefinition());
}
Я также пытался applicationContext.refresh()
, но я получил ошибку, в которой говорится, что generic applicationContext can be refreshed only once
есть более чистый способ сделать это