Java 9 创建自定义运行时映像

一. 什么是自定义运行时映像?

在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><
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值