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

时间:2017-05-25 10:35:59

标签: java java-9 jigsaw

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

2 个答案:

答案 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图像的可能性模块或依赖它的任何其他模块。在理想的世界中,所有模块都声明了他们需要的精确模块。