一. 什么是自定义运行时映像?
在JDK 9之前,Java运行时映像可用作巨大整体的单体(artifact),从而增加了下载时间,启动时间和内存占用。单体JRE使得不可能在具有小内存的设备上使用Java。 如果将Java应用程序部署到云端,则需要支付使用的内存; 最常见的是,单体JRE使用的内存比所要求的内存还要多,因此为云服务支付更多的内存。 在Java 8中引入的Compact配置文件,以减少JRE大小,从而减少运行时内存占用 —— 通过允许将JRE的一个子集打包在称为Compact配置文件的自定义运行时映像中。
Java 9采用了整体的方法来打包运行时映像。 所有平台代码都已经模块化了。 你的应用程序代码也打包模块化了。 在Java 9中,可以创建一个自定义运行时,它将包含应用程序模块和应用程序所使用的平台模块。 还可以在运行时映像中打包本地命令。 创建运行时映像的另一个好处是,你只需将一个包——运行时映像——发送给你的应用程序用户,而不需要下载并安装单独的JRE软件包来运行应用程序。更多Java学习教程薇老师:hua2021ei
运行时映像以特定格式存储,称为JIMAGE,该格式针对空间和速度进行了优化。 仅在运行时支持JIMAGE格式。 它是用于在JDK中存储和索引模块,类和资源的容器格式。 从JIMAGE文件搜索和加载类比从JAR和JMOD文件快很多。 JIMAGE格式是JDK内部的,开发人员很少需要直接与JIMAGE文件进行交互。
预计JIMAGE格式将随着时间的推移而不断发展,因此其内部部件不会面向开发人员。 JDK 9附带了一个名为jimage的工具,可用于浏览JIMAGE文件。
Tips
可以使用jlink工具来创建一个运行时映像,它使用一种名为JIMAGE的新文件来存储模块。 JDK 9附带jimage工具,可以浏览JIMAGE文件的内容。
如果你的代码期望将运行时映像存储在名为rt.jar文件的文件中,请谨慎。 JDK运行库存储在JDK 9之前的rt.jar文件中,但在JDK 9中不再是这样。当将应用程序迁移到JDK 9时,可能会破坏你的代码。
二. 创建自定义运行时映像
可以使用jlink工具创建特定于平台的运行时映像。 运行时映像将包含指定的应用程序模块和只需的平台模块,从而减少运行时映像的大小。 这对于在具有少量内存的嵌入式设备上运行的应用程序非常有用。 JDK 9附带了jlink工具。 它位于JDK_HOME\bin目录中。 运行jlink工具的一般语法如下:
jlink <options> --module-path <modulepath> --add-modules <mods> --output <path>
在这里,<options>
包括jlink的零个或多个选项,如下面表格所示,<modulepath>
是平台和应用程序模块所在的模块路径以添加到映像中。 模块可以是模块化的JAR,展开目录和JMOD文件。 <mods>
是要添加到映像的模块的列表,这可能会导致添加其他模块,因为其他模块的传递依赖关系。 <path>
是生成的运行时映像被存储的输出目录。
选项 | 描述 |
---|---|
--add-modules <mod>,<mod>... |
指定要解析的根模块列表。 所有已解析的模块将被添加到运行时映像中。 |
--bind-services |
在链接过程中执行完整的服务绑定。 如果添加的模块包含uses 语句,jlink将扫描模块路径上的所有JMOD文件,包括在uses 语句中指定的服务运行时映像中的所有服务提供者的模块。 |
-c, --compress <0 OR 1 OR 2>[:filter=<pattern-list>] |
指定输映像中所有资源的压缩级别。 0表示常量字符串共享,1表示ZIP,2表示两者。 可以指定可选的<pattern-list> 过滤列出要包括的文件的模式。 |
--disable-plugin <plugin-name> |
禁用指定的插件。 |
--endian <little OR big> |
指定生成的运行时映像的字节指令。 默认值是本地平台的字节指令。 |
-h,--help |
打印使用说明和jlink工具的所有选项列表。 |
--ignore-signing-information |
当签名的模块化JAR链接在映像中时,抑制致命错误。 与签名的模块化JAR的相关的签名文件不会复制到运行时映像。 |
--launcher <command>=<module> |
指定模块的启动器命令。 <command> 是要生成以启动应用程序的命令的名称,例如runmyapp 。 该工具将创建一个脚本或批处理文件,<command> 以运行<module> 中的主类。 |
--launcher <command>=<module>/<main-class> |
指定模块和主类的启动器命令。 <command> 是要生成以启动应用程序的命令的名称,例如runmyapp 。 该工具将创建一个脚本/批处理文件,<command> 以运行<module> 中的<main-class> 。 |
--limit-modules <mod>,<mod> |
将可观察模块限制在命名模块的传递性关闭主模块(如果指定)以及使用--add-modules 选项指定的任何其他模块中。 |
--list-plugins |
列出可用的插件。 |
-p, --module-path <modulepath> |
指定找到将平台和应用程序模块添加到运行时映像的模块路径。 |
--no-header-files |
排除本地代码的include头文件。 |
--no-man-pages |
排除手册主页。 |
--output <path>< |