Я работаю над приложением Spring Boot. Я хочу предоставить (довольно рудиментарную) систему плагинов. Сначала я надеялся, что это будет достаточно просто добавить JAR к классам, как так:Загрузка компонентов весов из внешнего JAR-файла
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
Method method = sysclass.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(sysloader, new File("./plugin/plugin.jar").toURI().toURL());
SpringApplication.run(Application.class, args);
В plugin.jar класс с аннотацией @Controller
и RequestMapping. Контекст загружается отлично, и конструктор контроллера также вызван. Однако, смотря на журналы, я вижу, что RequestMapping не подхватили.
Кроме того, если я пытаюсь установить JpaRepository в контроллере плагинов, он не отвечает, что не может найти класс интерфейса репозитория (который, как я предполагаю, представляет собой некоторую проблему, возникшую из-за того, что я возился с ClassLoader).
Просто автоустановка репозитория в моем основном приложении работает нормально, так что это не должно быть проблемой с его конфигурацией.
Есть ли что-то, что я делаю неправильно? Могу ли я настроить Springs ApplicationContext или его ClassLoader для правильной работы?
Подводя итог, я хочу загрузить некоторые контроллеры (и, возможно, другие компоненты Spring) во время выполнения из внешнего JAR в другой папке.
Надеюсь, я правильно вас понимаю. В конфигурации Spring вы можете сделать , где пакет существует в вашей внешней банке. Это сканирует пакет для аннотаций и создаст Контроллер и его RequestMappings в вашем контейнере Spring, чтобы вы могли их автоувеличивать. –
ConMan
Я должен был уточнить, что я хочу избежать использования конфигурации XML, если это возможно. Прямо сейчас я использую '@ComponentScan (« com.base.package »)', чтобы сообщить Spring загрузить все под ним. Это работает только для зависимостей времени компиляции, но не для JAR, которые должны быть загружены во время выполнения. Моя цель состоит в том, чтобы все плагины в папке плагина загружались при запуске приложения, в идеале не зная о них во время компиляции. – mhlz
Возможно, вам стоит взглянуть на https://github.com/spring-projects/spring-plugin. Я не думаю, что это поведение поддерживается из коробки с весенним ботинком. –