Java 9 模块 1:简介
Java
JPMS
什么是模块
一种包含了代码和描述了与其他模块之间依赖关系的元数据的带唯一标识的代码构件(artifacts)
模块应该具有的要求
- 强封装:在public的部分和内部使用的部分之间,必须有明确的边界。边界外是无法访问边界内的部分的。
- 明确的依赖描述:依赖应该是模块定义的一部分。
- 唯一的标识:不同的模块必须具有不同的名字。
Before Java 9
Java 9之前,Java本身是没有符合以上要求的模块系统的,当时主要使用package作为封装方式,使用Jar 作为模块,具有很多缺陷。
封装方式由 package和访问修饰符(private, protected, public,包私有)控制:
- 任何模块都能访问其他模块的public的代码,不同Jar下的同名包可以相互访问包私有的代码。
- 无法控制非平台开发者对平台内部包的访问,如应用代码可以访问sun.misc、com.sun.security这样和具体平台绑定的包。
- 没有明确的依赖信息,模块开发者无法设置必须的依赖,模块使用者不清楚该模块必须依赖哪些模块。
开发者为了管理依赖,只能使用外部的工具,如Maven、Gradle、OSGI等。
Java 9 模块系统
Java 9通过Jigsaw项目引入了新的模块系统 Java Platform Module System,简称 JPMS,该系统主要目标如下:
- 为开发者提供一个官方的有标准的模块系统
- 使用上诉模块系统将Java标准库本身进行模块化
为什么要使用 JPMS
- 明确的依赖配置,JPMS会在编译和运行之前检查当前环境是否满足依赖的要求。JPMS会检查版本冲突,即当有两个模块暴露了相同的包名时,系统会抛出异常。JPMS支持传递性依赖。
- 强大的封装,模块可以明确指定哪些包能暴露给哪些模块,JPMS不允许代码使用反射的方式访问不对外开放的包。
- 性能优化,JPMS完全清楚哪些模块是需要的,所以不需要的模块不会被JVM载入。
JPMS不足
JPMS 仍然缺乏对模块的版本的支持,虽然可以对模块添加版本元数据,但是对模块依赖声明中缺无法指定具体版本的信息。