Java 平台模块系统是否减小了 JAR 的大小?

Does the Java Platform Module System reduce a JAR size?

Here Jigsaw 的以下优点描述:

As part of Project Jigsaw, all the Java Platform APIs have been split up into separate modules. The benefit of splitting all the Java APIs up into modules is that you can now specify what modules of the Java platform your application requires. Knowing what Java Platform modules your application requires, Java can package up your application including only the Java Platform modules that your application actually uses.

但是,我不明白它是如何工作的,因为据我所知,Java 不会 所需的模块直接放在 JAR 中。它只是在模块路径中寻找它们。那么,Java 减少 JAR 大小的方法是什么?

Java can package up your application including only the Java Platform modules that your application actually uses.

从 Java 9 开始,可以使用 jlink 工具创建 自定义 运行时间图像

基本上,自定义 运行time 图像是一个包,它不仅包含您的第 3 方库,还包含所需的 JVM 部分。这是某种 self-contained 可执行映像,其中包含 运行 它所需的一切,无需在 OS 上安装 JRE。这是一个很好的功能,因为您不必担心是否有人安装了特定的 JRE 版本来 运行 图像。

现在,我猜你所指的句子并不想说与 pre-Java-9 (non-modular) JAR 相比,JAR 的大小减小了。我认为作者想说的是,与包含整个 JVM 的 JAR 相比,仅打包 JVM 所需模块的能力 减小了它的大小。

例如,假设您正在编写一个仅使用一些基本 Java API 的应用程序,例如集合、IO 或日期和时间 API(包含在java.base module). Since you aren't using API's like Swing (java.desktop module) or JDBC (java.sql 模块),您不需要将它们包含在您的包中。因此,您可以明确指定您的应用程序正在使用哪些 java 模块(在 module-info.java 文件中),并且只有那些将与你的应用程序。在这种情况下,您只需在所需模块列表中添加 java.base 模块。另一方面,如果需要使用 JDBC 添加对应用程序的数据库访问,您需要将 java.sql 模块添加到模块列表中。如您所见,无需将整个 JVM 与您的应用程序捆绑在一起,因为您可以选择需要哪些 JVM 模块。