向Java应用程序动态添加bean和jar



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

对于这样的系统,如果@Inject注释不会抛出一个不存在的类实现的运行时失败(因为没有加载该模块-jar),那将是相当方便的。

目前有这样的系统吗?spring或OSGi适合这种需求吗?你知道Jigsaw项目在应用程序层面上实现这个目标有多接近吗?

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

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

  1. 我建议你不要遵循这个路径
  2. 在不使用OGSI的情况下动态加载jar文件应该是可能的。关键字是类加载器,特别是在与适当的层次结构一起使用时。下面的答案应该给你一个想法:我应该如何在运行时动态加载jar ?但请记住,这可能会导致严重的安全问题
  3. 你在2点走了这条路。即使我劝你不要做那件事。但是现在,您所使用的框架的上下文不知道这些类。大多数IOC框架都会遇到这个问题。因为他们在启动时就建立了上下文。有一些库是为开发目的而创建的(spring加载的、spring开发工具、JRebel)。如果您的IOC框架支持它,就使用它。
  4. 关于处理不可用的jar。对此进行研究的最佳点是Spring Boot及其自动配置机制。它检查某些类/jar(不确定是否诚实)是否可用,并为这种情况添加额外的行为。但这仍然是应用程序启动解决方案,而不是运行时IOC解决方案。

最新更新