从外部JAR文件加载Spring组件

时间:2015-06-11 13:31:58

标签: java spring spring-mvc spring-boot

我正在开发一个Spring Boot应用程序。我想提供一个(非常简陋的)插件系统。最初我希望只需将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没有被提取。

此外,如果我在插件控制器中尝试@Autowire一个JpaRepository,它就会失败,抱怨它无法找到存储库接口类(我猜这是因为我搞乱了类加载器)。

只是在我的主应用程序中自动装配存储库工作正常,因此它的配置不应该是一个问题。

我有什么问题吗?我可以配置Springs ApplicationContext或其ClassLoader以使其正常工作吗?

总而言之,我想在运行时从另一个文件夹中的外部JAR加载一些控制器(可能还有其他Spring组件)。

2 个答案:

答案 0 :(得分:0)

现在我刚刚在我的应用程序pom中为我的各种插件声明了配置文件,我只是使用我想要的插件的配置文件来编译它。它不是很动态,但至少我可以完全将插件开发与应用程序开发分开,并让Spring接受所有插件的组件。

这不是我想要的,但我想我会描述我是如何“解决”它的。如果有人知道如何使用外部JAR工作,我很乐意接受这个答案!

答案 1 :(得分:0)

我通过导入我的控制器所在的依赖项来解决这个问题,然后调用控制器的包和主运行方法相同的名称(但在不同的项目中)。它是一个黑客,但它的确有效。