Java Platform Module System会减小JAR大小吗?

时间:2019-07-03 16:01:39

标签: java jar java-9 jigsaw

Here描述了拼图的以下好处:

  

作为Project Jigsaw的一部分,所有Java Platform API均被拆分为单独的模块。将所有Java API分成模块的好处是,您现在可以指定应用程序需要Java平台的哪些模块。知道您的应用程序需要哪些Java平台模块后,Java可以打包您的应用程序,包括仅您的应用程序实际使用的Java平台模块。

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

1 个答案:

答案 0 :(得分:5)

  

Java可以打包仅包含Java平台的应用程序   您的应用程序实际使用的模块。

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

基本上,自定义运行时映像是一个软件包,不仅包含您的第三方库,而且还包含JVM的必需部分。这是一种自包含的可执行映像,其中包含运行它所需的所有内容,而无需在操作系统上安装JRE。这是一个很好的功能,因为您不必担心是否有人安装了特定的JRE版本来运行映像。

现在,我猜想您所引用的句子不是要说与Java-9之前的(非模块化)JAR相比,减小了JAR的大小。我认为作者想说的是,仅打包所需的JVM模块的功能与包含整个JVM的JAR相比,减小了其大小。

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