这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战。
上一篇文章讲了Java9 API层面的一些升级迭代,这篇文章将专门来讲讲模块化。模块化每次提及都是Java的重大更新,但其实真实用户寥寥无几。随着容器的普及,减少的那一点jar包的体积更是可以忽略不计。先来介绍一下什么是模块化。
模块化简介
大家都知道Java的package,需要的时候引入(import)一下对应的类,module在package的上面一层,一个模块都会有一个module-info.java的描述文件,来描述当前模块需要引入哪些package和对哪些package可见。
module com.foo.bar {
requires org.baz.qux;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
这么做的好处,首先对于jdk本身来说我不需要的package我就不要了引入了,不像现在会默认塞一个rt.jar进来,这个东西有60M多,但大部分的内容都没用到。然后没有在module-info.java中声明的exports,即使是public的类在外部也无法被使用,这就进一步增强了安全性。
jdk身先士卒首先将rt.java拆成了很多个小的jmod文件,但好像也仅限于此,热门框架跟进的不积极。基于现有的Spring boot+maven的管理模式,大到依赖管理小到bean的管理都井井有条。如果各大框架进一步拆解自己的变成一个个模块,那可能确实打出来的jar会小一些,但可惜多数是没有响应的。
模块和maven不是一个东西
这个依赖管理让很多人一眼就想到了maven,但两者解决的不是一个问题。maven只能管到jar包的依赖,而module会深入到类中去做更精细的依赖管理和权限控制。而maven本身还有更重要的活去干:编译、测试、打包、发布等。
鉴于确实没多少人用,我也很难下结论说他好还是不好,只是现有的项目想迁移成本是极高的,新的项目不用module也可以实现大部分的功能,只是jar会比较大一些,不过在容器本身的体积面前确实也不算什么。