为什么java9模块系统会有对其他模块有传递依赖的java.se模块。这不是和在Java9之前的世界中依赖整个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;
}
发布于 2017-05-25 19:51:11
据我所知,主要原因是与非模块化Java代码的兼容性。当编译或启动没有模块声明或描述符(定义其依赖项)的代码时,就会出现一个问题,即允许它“看到”JDK中的哪些模块。
如果这些都是JDK中的模块,那么Java模块将“掩盖”放在类路径上的任何Java实现。这是模块和类路径(最终出现在未命名模块中)之间交互的一个特性:如果一个包同时存在于常规模块和未命名模块中,则后者实际上是不可见的。
为了弥补这一事实,并不是所有模块对于类路径上的代码都是可见的。相反,模块解析(解析应用程序的依赖项)将从根模块java.se开始,从而忽略java.se模块。
有关更详细的解释,请查看this mail from Alan Bateman,他在其中解释了相应JEP 261的更改。
发布于 2017-05-26 12:41:00
java.se
模块是Java9中应用程序可用的默认模块集(也称为“根模块”)。您是对的,java.se
模块大约是旧JDK的rt.jar
中的80% (如果您想要完整的rt.jar
,请查看java.se.ee
模块)。
Java9模块化的一个关键优势是新的jlink
实用程序,它将把您的JDK“缩小”到只需要的模块。例如,假设您编写了一个非常简单的Java应用程序,该应用程序只依赖于java.base
模块,并且希望以尽可能小的形式分发。您可以运行JDK实用程序来创建一个只包含java.base
模块的jlink
映像,因为这是您的应用程序运行所需的全部内容。
回到java.se
模块,编写一个requires java.se
的模块可能是愚蠢的,因为这将破坏jlink
为该模块或任何其他依赖于它的模块创建漂亮的小型JDK镜像的可能性。在理想情况下,所有模块都声明它们所需的精确模块。
https://stackoverflow.com/questions/44178366
复制相似问题