我正在开发一个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组件)。
答案 0 :(得分:0)
现在我刚刚在我的应用程序pom中为我的各种插件声明了配置文件,我只是使用我想要的插件的配置文件来编译它。它不是很动态,但至少我可以完全将插件开发与应用程序开发分开,并让Spring接受所有插件的组件。
这不是我想要的,但我想我会描述我是如何“解决”它的。如果有人知道如何使用外部JAR工作,我很乐意接受这个答案!
答案 1 :(得分:0)
我通过导入我的控制器所在的依赖项来解决这个问题,然后调用控制器的包和主运行方法相同的名称(但在不同的项目中)。它是一个黑客,但它的确有效。