进击的 Java(三)
上一篇文章讲了 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 会比较大一些,不过在容器本身的体积面前确实也不算什么。
评论