我正在 intelliJ 中使用 Java 9: 我创建了 4 个模块(所有模块都依赖于 module1):
- module1:导出包 pkg1 并将 pkg2 导出到模块 2。
- module2:需要 module1 并且能够访问这两个包
- module3:需要 module1 并且只能访问 pkg1
- module4:没有module-info.class,可以访问module1的两个包
我认为自动模块应该要求所有暴露的封装,而不是那些未暴露的。
如果封装仅适用于显式模块 JAR,我不明白封装的意义何在。
我错过了什么?
最佳答案
在您的示例中,module4 将无法访问pkg2
。自动模块读取所有其他模块(因为它们无法表达依赖关系),但 rules to access types未更改,因此只能访问导出包中的公共(public)类型。
基于您的引用的一些背景:
I thought that automatic modules should require all exposed packaged but not the ones which are not exposed.
显式模块(即非自动模块)需要其他模块。在运行时,这些 require 指令是 turned into readability edges 。但它们并不是这些边的唯一来源:对于自动模块,边会添加到每个已解析的模块中(即将其放入可读性图中)。
因此,当您说“自动模块应该需要所有公开的包”时,有一些错误,可能在翻译中丢失,但我仍然想澄清一下。该句子应该改为“自动模块读取所有(已解析)模块”。
现阶段还没有人谈论可访问性和软件包。这是下一步,这里的自动模块并不特殊,因此它们无法访问内部 API。
关于java - 为什么未模块的 JAR 可以访问模块 JAR 的非公开包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47346736/