【JVM】Java 模块化系统 1/2

793 阅读2分钟

Java 模块化系统(Java Platform Module System,JPMS),在 JDK9 中引入。

JAR 包与模块

JDK9 提出类与“类路径”(ClassPath)相对应的“模块路径”(ModulePath)的概念。某个类到底是模块还是传统的 JAR 包,只取决于它存放在哪种路径上。

  • JAR 包:只要放在类路径上的 JAR 文件,无论其中是否包含模块化信息(是否包含 module-info.class 文件),它都会被当作传统 JAR 包;
  • 模块:只要放在模块路径上的 JAR 文件,即使没有使用 JMOD 后缀,甚至不包含 module-info.class 文件,也会被当作一个模块。

访问规则

  • JAR 文件在类路径的访问规则:所有类路径下的 JAR 文件及其他资源文件,都被视为自动打包在一个匿名模块(Unnamed Module)里。
  • 模块在模块路径的访问规则:模块路径下的具名模块(Named Module)看不见传统 JAR 包的内容。
  • JAR 文件在模块路径的访问规则:如果把一个传统的、不包含模块定义的 JAR 文件放置到模块路径中,它就会变成一个自动模块(Automatic Module)。

整个 JDK 都基于模块化进行构建(原来的 rt.jar 和 tools.jar 被拆分成数十个 JMOD 文件)。 <JAVA_HOM E>\lib\ext目录、<JAVA_HOM E>\jre目录,被移除

模块化下的类加载器

JDK9 中,依然保持着三层类加载器架构与双亲委派模型,但是其中的扩展类加载器被平台类加载器所取代。 image.png

委派规则

类加载器收到类加载请求后,在委派给父加载器加载前,要先判断该类是否能够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的类加载器完成加载。(可以看成是对双亲委派的一种“破坏”)

Java 模块化系统明确规定了三个类加载器负责各自加载的模块。