7

为什么 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;
}
4

2 回答 2

10

据我所知,主要原因是与非模块化 Java EE 代码的兼容性。当编译或启动没有模块声明或描述符(定义其依赖项)的代码时,就会出现问题,即允许“查看”来自 JDK 的哪些模块。

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

为了弥补这一事实,并非所有模块都对类路径上的代码可见。相反,模块解析(解析应用程序的依赖项)将从根模块java.se开始,从而忽略 Java EE 模块。

如需更详细的解释,请查看Alan Bateman 的这封邮件,其中他解释了相应JEP 261的更改。

于 2017-05-25T11:51:10.567 回答
4

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

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

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

于 2017-05-26T04:41:00.303 回答