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



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

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

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

这是一个高级主题。在高水平的情况下,模块系统不是动态的,因为无法在运行的VM中卸载或替换单个模块。但是,您可以使用API,特别是java.lang.module.Configurationjava.lang.ModuleLayer来创建模块的动态配置,并将它们在运行的VM中实例化作为模块层。在您的方案中,您可以创建一个带有B和C的模块。一旦没有参考,该模块将被GC'ED/卸载。

正如我所说,这是一个高级主题,最好花时间掌握包括服务在内的基础知识,然后才能进入动态配置和模块层。

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

Java 9之前,您可以使用自定义的集体加载程序实例来实现类似的目标。例如,例如,诸如TOMCAT之类的应用程序服务器如何允许您 repeeploy 一个应用程序 - 基本上通过使用特定的类Loader实例扔掉整个"上下文"。p>使用java9,使用层抽象 - 但最终表示实际创建不同类加载器的实际创建图层的实现。

以及有关层的进一步阅读请参阅此答案,我给了我一些时间回到类似的问题(该问题的重点是如何在单个应用程序中使用同一模块的不同版本)。<<<<<<<<<<<<<</p>

最新更新