Динамически загружать компоненты пружины после загрузки банки во время выполнения - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь загрузить компоненты 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 есть более чистый способ сделать это

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