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

标签 java java-platform-module-system

我不确定我是否理解正确:java.base 是所有其他模块的基础基础模块,包含它们的所有基础内容,就像类的父类(super class)一样。 java.se 是包含整个 JDK 的模块,就像一个子类(包含基本功能和更具体的东西)

最佳答案

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 中存在的所有类,除了现在被分离在不同的模块中,例如java.desktopjava.sql。它不包括 JDK 特定模块(例如 jdk.javadoc)。 Java 运行时可能不一定提供所有这些模块;例如你可以使用 jlink创建一个仅包含您需要的模块的 Java 运行时(至少 java.base)。

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

您与类(模块 java.base)及其子类(模块 java.se)的比较在这种情况下有效,因为 java.se 有点像一个“聚合器”模块,它本身不包含或导出任何包,但仅通过 requires transitive 间接导出。参见 this question为什么存在 java.se 模块。虽然通常你不会声明对 java.se 的依赖,因为这违背了制作自定义小运行时图像的目的;相反,您只会声明对您真正需要的特定模块的依赖性,例如java.logging.

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

关于java - Java平台模块系统中的 'java.se'和 'java.base'模块有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71482750/

相关文章:

java - Thymeleaf 和 Spring4 配置

java - 在 Oreo 中识别短信号码 ID

java - Spring 和 Rest 服务之间的主要区别是什么

java - maven-jar-plugin 指定 mainClass

java - 字节码是否知道 Java 版本

java - 使用 Rest API 在 Azure IoT 中心创建共享访问策略

java - 为什么 Activity 无法正常恢复?

java - 拼图 "requires transitive"不工作

java - 无法使字段最终 transient java.lang.Class java.util.EnumSet.elementType 可访问 : module java. 基不 "opens java.util"未命名

java - 从 main 调用时 opencsv 抛出异常,并且存在 module-info.java