Java 平台模块系统中的 'java.se' 和 'java.base' 模块有什么区别

What's the difference between the 'java.se' and 'java.base' Module in Java Platform Modules System

我不确定我是否理解正确:java.base 是来自所有其他模块的底层基础模块,包含来自它们的所有基础内容,例如来自 [= 的 superclass 17=]。 java.se 是包含整个 JDK 的模块,就像一个 subclass(包含基本功能和更具体的东西)

java.base是基础模块;每个其他模块都隐式或显式地依赖于它:

If the declaration of a module does not express a dependence on the java.base module [...] then the module has an implicitly declared dependence on the java.base module.

(Java Language Specification 17 §7.7.1)

java.se“定义 Java SE 平台的 API”(根据文档)。它大致(?)包含模块化之前 Java SE 中存在的所有 classes,除了现在在不同的模块中分开,例如java.desktopjava.sql。它不包括 JDK 个特定模块(例如 jdk.javadoc)。 Java 运行时可能不一定提供所有这些模块;例如,您可以使用 jlink 创建一个 Java 运行时,它只包含您需要的模块(至少 java.base)。

Java API 规范也有助于理解模块的内容及其关系:

您与 class(模块 java.base)及其子 class(模块 java.se)的比较在这种情况下有效,因为 java.se 表现得很好就像一个 'aggregator' 模块,它本身不包含或导出任何包,但仅通过 requires transitive 间接导出。请参阅 this question 以了解 java.se 模块存在的原因。虽然通常你不会声明对 java.se 的依赖,因为这违背了制作自定义小型运行时图像的目的;相反,您只会声明对您真正需要的特定模块的依赖性,例如java.logging.

虽然这样的聚合器模块并不常见。在大多数情况下,模块更适合用于对相关包进行分组,并限制对内部实现的访问。但是,在这些情况下,由一个模块定义的服务和正在实现的相应服务提供者 declared by another module 与您的类比相似。