1
60
我首先回答你的实际问题(“什么是自动模块?”),但我也解释了它们是什么 对于 the module's properties (name, requires, exports) . 对于普通JAR(没有模块描述符),这种方法不起作用,那么模块系统应该做什么呢?它会自动创建一个模块-一个 automatic module 可以说,对这三种属性进行了最安全的猜测。 名称获得名称需要两个步骤:
要求由于普通JAR表示no requires子句,因此模块系统允许自动模块将所有其他模块读入 readability graph (又称模块图)。与显式模块不同,自动模块还读取未命名模块,该模块包含从类路径加载的所有内容。这个看似微不足道的细节非常重要(见下文)。 尽管如此,自动模块还有一些可读性要求:
总而言之,这可能会产生不幸的后果,即依赖于多个普通JAR的显式模块(即非自动模块)只需要其中一个就可以逃脱惩罚(只要其他模块也在模块路径上结束)。 导出/打开
更多
模块系统还扫描
创建自动模块后,它将被视为任何其他模块。这明确包括模块系统将其检查为任何其他模块,例如拆分包。 什么是自动模块 ?
为了保持它们的可靠性,模块声明除了命名模块之外,没有任何其他要求,命名模块排除了从类路径加载的所有内容。如果故事到此结束,一个模块化罐子只能依赖于其他模块化罐子,这将迫使生态系统从下到上进行模块化。
有趣的是,因为自动模块读取未命名的模块,所以将其依赖项保留在类路径上是可行的(我通常建议这样做)。这样,自动模块充当从模块到类路径的桥梁。 您的模块可以位于一侧,需要它们作为自动模块的直接依赖关系,而间接依赖关系可以保留在另一侧。 每次您的一个依赖项变成显式模块时,它都会将桥留在模块一侧,并将其直接依赖项作为自动模块绘制到桥上。 |
2
9
使用它们的主要好处是,它们允许您在编译或运行时将工件视为模块,而无需等待它迁移到模块结构。
自动模块名称
在其主清单条目中。否则,模块名由
由于自动模块没有模块声明,因此实际上无法判断它读取、打开或导出的所有模块或包。 因此,由于没有针对驻留在自动模块中的包的显式导出/打开,如下所述:-
其中一个 proposals -自动模块提供了传统的封装级别: 所有软件包都是 开放式深层反光通道 和 导出用于普通编译时和运行时访问 它们的公共类型 . 此外,一个自动模块
|
3
5
(关于缺少完整定义,您似乎是对的,因为我在语言或JVM规范中没有找到它)
Javadocs在
部分引用自 https://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleFinder.html#automatic-modules :
和来自 https://docs.oracle.com/javase/9/docs/api/java/lang/module/ModuleDescriptor.html :
编辑(2021年): 这 section on module dependences Java语言规范中有以下有趣的注释:
|