2015-06-11 4 views
3

Я работаю над приложением 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 в другой папке.

+0

Надеюсь, я правильно вас понимаю. В конфигурации Spring вы можете сделать , где пакет существует в вашей внешней банке. Это сканирует пакет для аннотаций и создаст Контроллер и его RequestMappings в вашем контейнере Spring, чтобы вы могли их автоувеличивать. – ConMan

+0

Я должен был уточнить, что я хочу избежать использования конфигурации XML, если это возможно. Прямо сейчас я использую '@ComponentScan (« com.base.package »)', чтобы сообщить Spring загрузить все под ним. Это работает только для зависимостей времени компиляции, но не для JAR, которые должны быть загружены во время выполнения. Моя цель состоит в том, чтобы все плагины в папке плагина загружались при запуске приложения, в идеале не зная о них во время компиляции. – mhlz

+0

Возможно, вам стоит взглянуть на https://github.com/spring-projects/spring-plugin. Я не думаю, что это поведение поддерживается из коробки с весенним ботинком. –

ответ

0

На данный момент я только что объявил объявления профилей в моем приложении pom для моих различных плагинов, и я просто скомпилирую его, используя профили плагинов, которые я хочу. Это не очень динамично, но, по крайней мере, я могу полностью отделить разработку плагина от разработки приложения, а Spring - на всех компонентах плагина.

Это не совсем то, что я хотел, но я решил, что опишу, как я его «решил». Если кто-то знает способ сделать эту работу с внешними JAR, я был бы рад принять этот ответ!

0

Я решил это, импортируя зависимость, в которой находится мой контроллер, а затем вызывает пакеты контроллера и метода основного запуска с тем же именем (но в разных проектах). Это взлом, но он работает.

+0

Это точно то же самое, что я описал в своем собственном ответе. Кроме того, вам не нужно называть имена одинаковых имен. Им просто нужен общий корень, и вы можете использовать аннотации, чтобы сообщить SpringBoot, где сканировать: http://stackoverflow.com/questions/29257409/maven-configuration-with-spring-boot-multi-modules-run-application-in- интелл/29258163 # 29258163 – mhlz

Смежные вопросы