我是JPMS的初学者,无法理解它的活力。例如,在当前JVM实例moduleA.jar
正在运行。 moduleA
仅需java.base
个模块。现在,我想要
moduleB.jar
模块和java.sql
moduleC.jar
moduleB
moduleB
,java.sql
,moduleC
并释放所有资源。可以在Java 9模块系统中完成吗?
答案 0 :(得分:13)
这是一个高级主题。在高级别,模块系统不是动态的,因为在运行的VM中无法卸载或替换单个模块。但是,您可以使用API(特别是java.lang.module.Configuration
和java.lang.ModuleLayer
来创建模块的动态配置,并在正在运行的VM中将它们实例化为一个模块层。在您的场景中,您可以创建一个包含模块B和C的模块层。一旦没有对它们的引用,这层模块将被GC&#39 / ed加载。
正如我所说,这是一个高级主题,在进入动态配置和模块层之前花时间掌握基础知识(包括服务)可能会更好。
答案 1 :(得分:5)
另一个答案完全正确,但请注意“最终”这些事情并没有真正改变。
在Java 9之前,您可以使用自定义类加载器实例来实现这样的功能。例如,Tomcat等应用程序服务器如何允许您重新部署应用程序 - 基本上抛弃了最初使用特定类加载器实例“构建”的“上下文”。
使用Java9,使用抽象层来描述概念 - 但最终它仍然意味着自定义代码需要提供所有实际创建具有不同类加载器的图层的实现。
对于图层的进一步阅读,请参阅此answer,我在一个类似的问题上给了一些时间(重点是如何在一个单独的问题中使用同一模块的不同版本应用程序)。