我是JPM的初学者,无法理解其动力。例如,在当前的JVM实例中,moduleA.jar
正在运行。moduleA
仅需要java.base
模块。现在,我想要
- 要动态加载
moduleB.jar
,需要java.sql
模块和moduleC.jar
- 从
moduleB
执行一些代码 - 从JVM卸下
moduleB
,java.sql
,moduleC
并发布所有资源。
可以在Java 9模块系统中完成吗?
这是一个高级主题。在高水平的情况下,模块系统不是动态的,因为无法在运行的VM中卸载或替换单个模块。但是,您可以使用API,特别是java.lang.module.Configuration
和java.lang.ModuleLayer
来创建模块的动态配置,并将它们在运行的VM中实例化作为模块层。在您的方案中,您可以创建一个带有B和C的模块。一旦没有参考,该模块将被GC'ED/卸载。
正如我所说,这是一个高级主题,最好花时间掌握包括服务在内的基础知识,然后才能进入动态配置和模块层。
另一个答案是完全正确的,但请注意,"最终"这些事情并没有真正改变。
Java 9之前,您可以使用自定义的集体加载程序实例来实现类似的目标。例如,例如,诸如TOMCAT之类的应用程序服务器如何允许您 repeeploy 一个应用程序 - 基本上通过使用特定的类Loader实例扔掉整个"上下文"。p>使用java9,使用层抽象 - 但最终表示实际创建不同类加载器的实际创建图层的实现。
以及有关层的进一步阅读请参阅此答案,我给了我一些时间回到类似的问题(该问题的重点是如何在单个应用程序中使用同一模块的不同版本)。<<<<<<<<<<<<<</p>