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

Pav*_*l_K 23 java java-9

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

  1. 动态加载moduleB.jar需要java.sql模块和moduleC.jar
  2. 执行一些代码 moduleB
  3. 卸载moduleB,java.sql,moduleC从JVM并释放所有资源.

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

Ala*_*man 13

这是一个高级主题.在高级别,模块系统不是动态的,因为在运行的VM中无法卸载或替换单个模块.但是,可以使用该API,特别java.lang.module.Configurationjava.lang.ModuleLayer创建模块的动态配置和在运行中的VM实例化它们作为模块的层.在您的场景中,您可以使用模块B和C创建一个模块层.一旦没有对它们的引用,这个模块层将被GC /卸载.

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


Gho*_*ica 5

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

在Java 9之前,您可以使用自定义类加载器实例来实现类似的功能。例如,这就是Tomcat之类的应用程序服务器如何允许您重新部署应用程序-通过基本上丢弃最初使用特定类加载器实例“构建”的整个“上下文”。

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

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