文章目录
模块化基础
JPMS
JPMS 全称Java Platform Module System,Java模块化系统。由JEP261引入(https://openjdk.org/jeps/261)
为什么要模块化?
在JDK 9之前,Java的运行时库(Runtime Library,JRE)包含一个庞大的rt.jar,其大小超过60MB,包含了Java大部分运行时类。随着JDK的发展,JDK增加了许多API,但几乎没有删除任何API,有些类,比如CORBA相关的类,现在己经很少用了,但仍然保留在JRE中,保留它们的唯一目的就是为了保证兼容性。再比如javafx相关的类,即使应用程序用不到,但是还是被包含在最终的生产jar包中。模块化的作用就是将JDK进行模块拆分,让应用程序选择依赖的模块,打包时只打包这些模块,从而可以起到精简运行时的目的。
- 封装
针对于库的开发者来说,经常有这种需求:类A被当前项目中其他包的其他类使用,但是不希望类A被使用这个库的其他项目使用,也就是保持一些API只在项目内部可见。虽然java提供了访问权限,但是只能做到包级别的访问控制。
模块化的JDK
JDK9之后,安装完成后会有一个jmods文件夹,里面包容了很多*.jmod文件,这些就是模块化后的JDK
可以通过/path/to/java.exe --list-modules
命令列出JDK的模块清单
以jdk.开头的模块包含了JDK特定的代码,在不同的JDK实现中可能会有所不同。
在JDK 9以上的版本中,java和javac等原有JDK命令行工具都针对模块进行了功能增强,添加了一些新的命令行参数,JDK中还添加了诸如jlink之类的新命令行工具
模块信息
通过/path/to/java --describe-module 模块名
命令可以查看模块的信息,这个信息实际上就是module-info.java文件中的内容(后面会提到)
➜ .\bin\java --describe-module java.base
java.base@11.0.18
exports java.io
exports java.lang
exports java.lang.annotation
exports java.lang.invoke
exports java.lang.module
exports java.lang.ref
exports java.lang.reflect
exports java.math
exports java.net
exports java.net.spi
exports java.nio
exports java.nio.channels
exports java.nio.channels.spi
exports java.nio.charset
exports