14.3 Java模块:全局视图

Java 9为Java程序提供了一个新的单位:模块。模块通过一个新的关键字2module声明,紧接着是模块的名字及它的主体。这样的模块描述符(module descriptor)3定义在一个特殊文件,即module-info.java中,最终被编译为module-info.class。模块描述符的主体包含一系列的子句,其中最重要的两个子句是requiresexportsrequires子句用于指定执行你的模块还需要哪些模块的支持,exports子句声明了你的模块中哪些包可以被其他模块访问和使用。本节稍后会详细介绍如何使用这些子句。

2严格来说,Java 9的模块标识符,比如modulerequiresexport,都是受限关键字。然而你还是可以在程序中将它们作为标识符使用(出于后向兼容性的考虑),不过它们在允许模块出现的上下文中会被解释成关键字。

3从约定上来说,文本形式应该被称为模块声明module-info.class中的二进制形式才应该被称为模块描述符

模块描述符描述和封装了一个或多个包(通常它跟这些包都位于同一个目录中),但是在简单的用例中,可以只导出这些包中的一个(即使其可见于其他模块)。

Java模块描述符的核心结构如图14-2所示。

14.3 Java模块:全局视图 - 图1

图 14-2 Java模块描述符的核心结构(module-info.java

将模块中的exportsrequires看作相互独立的部分,就像拼图游戏(这可能也是Jigsaw项目名称的起源)中的凸块(或者标签)与凹块的关系,对理解模块是非常有益的。图14-3展示了使用多个模块的一个例子。

14.3 Java模块:全局视图 - 图2

图 14-3 一个采用拼图游戏风格构建的Java系统,它由四个模块(A、B、C、D)组成。模块A依赖于模块B和模块C,需要访问包pkgB和包pkgC(分别由模块B和模块C导出)。模块C同样需要使用pkgD,因此它对模块D有依赖性,不过模块B不需要使用pkgD

当你使用Maven这样的构建工具时,模块描述之类的细节都被集成开发环境解决了,用户也就看不到这些琐碎的事情了。

话虽如此,下一节会结合例子详细探讨刚才介绍的这些概念。