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

时间:2017-09-08 09:12:20

标签: java java-9

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

  1. 要动态加载需要moduleB.jar模块和java.sql
  2. moduleC.jar
  3. 执行moduleB
  4. 中的一些代码
  5. 从JVM卸载moduleBjava.sqlmoduleC并释放所有资源。
  6. 可以在Java 9模块系统中完成吗?

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

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

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

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

对于图层的进一步阅读,请参阅此answer,我在一个类似的问题上给了一些时间(重点是如何在一个单独的问题中使用同一模块的不同版本应用程序)。