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

Is it possible to load and unload jdk and custom modules dynamically in Java 9?

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

  1. 动态加载需要 java.sql 模块和 moduleC.jar
  2. moduleB.jar
  3. 执行来自moduleB
  4. 的一些代码
  5. 从 JVM 卸载 moduleBjava.sqlmoduleC 并释放所有资源。

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

这是一个高级主题。在高层次上,模块系统不是动态的,因为单个模块不能在 运行 VM 中卸载或替换。但是,您可以使用 API,特别是 java.lang.module.Configurationjava.lang.ModuleLayer 创建模块的动态配置,并在 运行 VM 中将它们实例化为模块层。在你的场景中,那么你可能会创建一层模块,其中包含模块 B 和 C。一旦没有对它们的引用,这层模块将被 GC'ed/unloaded。

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

其他答案完全正确,但请注意"in the end"这些东西并没有真正改变。

在 Java 9 之前,您可以使用自定义 class 加载程序实例来实现类似的目的。例如,Tomcat 等应用程序服务器如何允许您 重新部署 应用程序 - 通过基本上丢弃最初 [=31] 的整个 "context" =] 使用特定的 class 加载器实例。

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

有关 layers 的进一步阅读,请参阅此 我花了一些时间回答类似的问题(重点是如何使用不同版本的单个应用程序中的相同模块)。