Java 9中java.se模块的意义是什么?

sum*_*eva 7 java java-platform-module-system java-9

为什么java 9模块系统具有java.se模块,该模块对其他模块具有传递依赖性.在Java 9之前的世界中依赖于整个rt.jar是不一样的.

module java.se {
    requires transitive java.desktop;
    requires transitive java.security.jgss;
    requires transitive java.security.sasl;
    requires transitive java.management;
    requires transitive java.logging;
    requires transitive java.datatransfer;
    requires transitive java.sql.rowset;
    requires transitive java.compiler;
    requires transitive java.sql;
    requires transitive java.naming;
    requires transitive java.prefs;
    requires transitive java.rmi;
    requires transitive java.xml.crypto;
    requires transitive java.management.rmi;
    requires transitive java.xml;
    requires transitive java.scripting;
    requires transitive java.instrument;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*lai 9

据我所知,主要原因是与非模块化Java EE代码的兼容性.当编译或启动没有模块声明或描述符(定义其依赖关系)的代码时,问题就出现了JDK允许哪些模块"看到".

如果这些都是JDK中的所有模块,那么Java EE将"掩盖"放在类路径上的任何Java EE实现.这是模块和类路径之间交互的特性(最终在未命名的模块中):如果一个包存在于常规模块和未命名的模块中,后者将是有效的不可见的.

为了解决这个问题,并非所有模块都可以在类路径上看到代码.相反,模块解析(解析应用程序的依赖关系)将从根模块java.se开始,从而忽略Java EE模块.

有关更详细的解释,请查看来自Alan Bateman的这封邮件,其中他解释了相应JEP 261的更改.


And*_*ert 5

java.se模块是 Java 9 中的应用程序可用的默认模块集(又名“根模块”)。您是对的,该模块大约是旧版 JDK 中java.se模块的 80% (如果您想全面了解一下)模块)。rt.jarrt.jarjava.se.ee

Java 9 模块化的一个关键优势是新的jlink实用程序,它将“缩小”您的 JDK,仅包含所需的模块。例如,假设您编写了一个非常简单的 Java 应用程序,仅依赖于java.base模块,并且您希望以尽可能小的形式进行分发。您可以运行该jlink实用程序来创建仅包含该java.base模块的 JDK 映像,因为这就是您的应用程序运行所需的全部内容。

回到java.se模块,编写这样的模块可能是愚蠢的,因为这会破坏为该模块或依赖于它的任何其他模块创建漂亮的小型 JDK 映像requires java.se的可能性。jlink在理想的世界中,所有模块都声明它们所需的精确模块。