是否可以在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
模块。现在,我想要
- 动态加载需要
java.sql
模块和 moduleC.jar
的 moduleB.jar
- 执行来自
moduleB
的一些代码
- 从 JVM 卸载
moduleB
、java.sql
、moduleC
并释放所有资源。
可以在Java 9模块系统中完成吗?
这是一个高级主题。在高层次上,模块系统不是动态的,因为单个模块不能在 运行 VM 中卸载或替换。但是,您可以使用 API,特别是 java.lang.module.Configuration
和 java.lang.ModuleLayer
创建模块的动态配置,并在 运行 VM 中将它们实例化为模块层。在你的场景中,那么你可能会创建一层模块,其中包含模块 B 和 C。一旦没有对它们的引用,这层模块将被 GC'ed/unloaded。
正如我所说,这是一个高级主题,在进入动态配置和模块层之前花时间掌握基础知识(包括服务)可能更好。
其他答案完全正确,但请注意"in the end"这些东西并没有真正改变。
在 Java 9 之前,您可以使用自定义 class 加载程序实例来实现类似的目的。例如,Tomcat 等应用程序服务器如何允许您 重新部署 应用程序 - 通过基本上丢弃最初 [=31] 的整个 "context" =] 使用特定的 class 加载器实例。
在 Java9 中,这个 概念 是使用层 抽象 描述的 - 但最终它仍然意味着自定义 代码需要提供使用不同 class 加载器实际创建层的所有实现。
有关 layers 的进一步阅读,请参阅此 我花了一些时间回答类似的问题(重点是如何使用不同版本的单个应用程序中的相同模块)。
我是 JPMS 的初学者,无法理解它的动态。例如,在当前 JVM 实例中 moduleA.jar
是 运行。 moduleA
只需要 java.base
模块。现在,我想要
- 动态加载需要
java.sql
模块和moduleC.jar
的 - 执行来自
moduleB
的一些代码
- 从 JVM 卸载
moduleB
、java.sql
、moduleC
并释放所有资源。
moduleB.jar
可以在Java 9模块系统中完成吗?
这是一个高级主题。在高层次上,模块系统不是动态的,因为单个模块不能在 运行 VM 中卸载或替换。但是,您可以使用 API,特别是 java.lang.module.Configuration
和 java.lang.ModuleLayer
创建模块的动态配置,并在 运行 VM 中将它们实例化为模块层。在你的场景中,那么你可能会创建一层模块,其中包含模块 B 和 C。一旦没有对它们的引用,这层模块将被 GC'ed/unloaded。
正如我所说,这是一个高级主题,在进入动态配置和模块层之前花时间掌握基础知识(包括服务)可能更好。
其他答案完全正确,但请注意"in the end"这些东西并没有真正改变。
在 Java 9 之前,您可以使用自定义 class 加载程序实例来实现类似的目的。例如,Tomcat 等应用程序服务器如何允许您 重新部署 应用程序 - 通过基本上丢弃最初 [=31] 的整个 "context" =] 使用特定的 class 加载器实例。
在 Java9 中,这个 概念 是使用层 抽象 描述的 - 但最终它仍然意味着自定义 代码需要提供使用不同 class 加载器实际创建层的所有实现。
有关 layers 的进一步阅读,请参阅此