可以在Java9中动态加载和卸载jdk和自定义模块吗?
我是JPMS的初学者,无法理解它的动态性。例如,在当前JVM实例中,可以在Java9中动态加载和卸载jdk和自定义模块吗?,java,java-9,Java,Java 9,我是JPMS的初学者,无法理解它的动态性。例如,在当前JVM实例中,moduleA.jar正在运行moduleA只需要java.base模块。现在,我想要 动态加载需要java.sql模块和moduleC.jar的moduleB.jar 从模块B执行一些代码 从JVM卸载moduleB,java.sql,moduleC,并释放所有资源 可以在Java 9模块系统中完成吗?这是一个高级主题。在高层,模块系统不是动态的,因为在运行的VM中无法卸载或替换单个模块。但是,您可以使用API,特别是java
moduleA.jar
正在运行moduleA
只需要java.base
模块。现在,我想要
java.sql
模块和moduleC.jar的moduleB.jar
moduleB
,java.sql
,moduleC
,并释放所有资源可以在Java 9模块系统中完成吗?这是一个高级主题。在高层,模块系统不是动态的,因为在运行的VM中无法卸载或替换单个模块。但是,您可以使用API,特别是
java.lang.module.Configuration
和java.lang.ModuleLayer
来创建模块的动态配置,并在运行的VM中将它们实例化为模块层。在您的场景中,您可以使用模块B和C创建一个模块层。一旦没有对这些模块的引用,该模块层将被GC’ed/卸载
正如我所说,这是一个高级主题,在进入动态配置和模块层之前,最好花时间掌握基本知识,包括服务。另一个答案完全正确,但请注意,“最终”这些东西并没有真正改变 在Java9之前,您可以使用自定义类装入器实例来实现类似的功能。例如,Tomcat之类的应用服务器允许您重新部署应用程序,方法是基本上丢弃最初使用特定类加载器实例“构建”的整个“上下文” 在Java9中,这个概念是使用层抽象来描述的——但最终它仍然意味着定制代码需要提供所有使用不同类加载器实际创建层的实现
关于层的进一步阅读,请看我在一个类似的问题上给出了一些时间(重点是如何在单个应用程序中使用同一模块的不同版本)。不是,如:OSGi的生命周期和动态服务注册设施……超出了[JPMS]的范围@你的评论把我弄糊涂了。在我的评论和链接中,我表明JPMS明确地、自觉地不打算提供OSGi中的动态生命周期特性,并且OSGi将一如既往地在Java9中运行。然而,你的话似乎超越了我,超越了下面提供的答案。你到底不明白这个问题是怎么回事?