是否可以在 Java 9 中动态加载和卸载 jdk 和自定义模块?

2022-09-01 17:43:58

我是JPMS的初学者,无法理解它的活力。例如,在当前 JVM 实例中正在运行。 只需要模块。现在,我想要moduleA.jarmoduleAjava.base

  1. 动态加载需要模块和moduleB.jarjava.sqlmoduleC.jar
  2. 执行一些代码moduleB
  3. 从 JVM 卸载 、 并释放所有资源。moduleBjava.sqlmoduleC

它可以在Java 9模块系统中完成吗?


答案 1

这是一个高级主题。从较高层次上讲,模块系统不是动态的,因为无法在正在运行的 VM 中卸载或替换单个模块。但是,可以使用 API,特别是创建模块的动态配置,并在正在运行的 VM 中将其实例化为模块层。在您的方案中,您可以创建具有模块 B 和 C 的模块层。一旦没有对模块的引用,这层模块将被GC'ed/unload。java.lang.module.Configurationjava.lang.ModuleLayer

正如我所说,这是一个高级主题,在进入动态配置和模块层之前,最好花时间掌握基础知识,包括服务。


答案 2

另一个答案是完全正确的,但请注意,“最终”这些事情并没有真正改变。

在 Java 9 之前,您可以使用定制类装入器实例来实现类似这样的目标。例如,像Tomcat这样的应用程序服务器如何允许您重新部署应用程序 - 通过基本上丢弃最初使用特定类装入器实例“构建”的整个“上下文”。

在Java9中,这个概念是用层抽象来描述的 - 但最终它仍然意味着定制代码需要提供使用不同类加载器实际创建层的所有实现。

有关的进一步阅读,请参阅这个答案,我在类似的问题上花了一些时间(该问题侧重于如何在单个应用程序中使用同一模块的不同版本)。


推荐