动态地将bean和jar添加到Java应用程序

时间:2016-09-27 11:55:34

标签: java spring java-ee cdi

对于正在进行的项目,我们正在寻找动态下载jar文件并将其加载到正在运行的应用程序中的可能性。除了下载文件(这可能相当简单)之外,我不知道任何可以自动将jar添加到类路径的解决方案,并且发现注释(如CDI bean)。

鉴于这样的系统,如果@Inject注释不会引发类的实现的运行时失败,那么它将非常方便(因为没有加载该模块jar)。

目前有这样的系统吗? spring或OSGi是否适合这种需求? 有任何想法Jigsaw试图在应用程序级别上实现这个目标的程度如何?

2 个答案:

答案 0 :(得分:3)

我认为你需要OSGI,使用像Karaf这样的OSGI容器:https://karaf.apache.org

在标准java中提供ServiceLoader https://docs.oracle.com/javase/tutorial/ext/basics/spi.html

答案 1 :(得分:1)

  1. 我建议你不要走那条路
  2. 应该可以在不使用OGSI的情况下动态加载jar文件。关键字是类加载器,尤其是在与适当的层次结构一起使用时。以下答案应该给你一个想法:How should I load Jars dynamically at runtime?但请记住,这可能会导致严重的安全问题
  3. 你沿着2号路走。即使我建议你不要这样做。但是现在你最终会遇到使用过的框架的上下文不知道这个类的情况。对于大多数IOC框架,您会遇到此问题。因为他们在启动时建立了上下文。为开发目的创建了一些库(Spring-loaded,spring dev工具,JRebel)。如果您的IOC框架支持它,请使用它。
  4. 关于处理不可用的罐子。对此进行研究的最佳点是Spring Boot及其自动配置机制。它会检查某些类/罐(不确定是否诚实)是否可用,并为此案例添加其他行为。但这仍然是应用程序启动解决方案,而不是运行时IOC解决方案。