为什么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;
}
答案 0 :(得分:8)
据我所知,主要原因是与非模块化Java EE代码的兼容性。当编译或启动没有模块声明或描述符(定义其依赖关系)的代码时,问题就出现了允许来自JDK的哪些模块"参见"。
如果这些都是JDK中的所有模块,那么Java EE将会淹没"放在类路径上的任何Java EE实现。这是模块和类路径之间交互的特性(最终在未命名的模块中):如果一个包存在于常规模块和未命名模块中,后者将实际上不可见。
要解决这个问题,并非所有模块都可以在类路径上看到代码。相反,模块解析(解决应用程序的依赖关系)将从根模块 java.se 开始,从而忽略Java EE模块。
有关更详细的说明,请查看this mail from Alan Bateman,其中他解释了相应JEP 261的更改。
答案 1 :(得分:3)
java.se
模块是Java 9中应用程序可用的默认模块集(也称为“根模块”)。java.se
模块大约是模块的80%。 rt.jar
较旧的JDK(如果您想要完整rt.jar
,请查看java.se.ee
模块。
Java 9模块化的一个关键优势是新的jlink
实用程序,它将JDK“缩小”为仅需要的模块。例如,假设您编写了一个非常简单的Java应用程序,该应用程序仅依赖于java.base
模块,并且您希望以尽可能小的形式进行分发。您可以运行jlink
实用程序来创建仅包含java.base
模块的JDK映像,因为这是您运行所需的所有应用程序。
回到java.se
模块,写一个requires java.se
模块可能是愚蠢的,因为这会破坏jlink
创建一个漂亮的小JDK图像的可能性模块或依赖它的任何其他模块。在理想的世界中,所有模块都声明了他们需要的精确模块。