JEP 282: jlink:Java 链接器
概述
创建一个工具,该工具可以将一组模块及其依赖项组装并优化为自定义运行时映像,如 JEP 220 中所定义。
非目标
该 JEP 并未承诺生成除模块化运行时镜像以外的任何内容。
此 JEP 的目标并非定义插件的标准或受支持的 API。相反,插件 API 将是严格实验性的。一旦通过此 JEP 定义的插件 API 获得了使用经验,未来的 JEP 可能会重新审视这一主题。
动机
JEP 261 将链接时间定义为编译阶段(javac
命令)和运行时阶段(java
运行时启动器)之间的一个可选阶段。链接时间需要一个链接工具,该工具将组装并优化一组模块及其传递依赖项,以创建运行时映像或可执行文件。
链接时间是进行全局优化的一个机会,而这些优化在编译时通常难以实现,或者在运行时成本较高。例如,当一个计算的所有输入都变为常量(即,不再是未知数)时,可以对该计算进行优化。接下来的优化步骤是移除那些不再可达的代码。
描述
链接器工具 jlink
的基本调用方式为:
$ jlink --module-path <modulepath> --add-modules <modules> --limit-modules <modules> --output <path>
哪里:
-
--module-path
是链接器发现可观测模块的路径;这些模块可以是模块化 JAR 文件、JMOD 文件或解压后的模块 -
--add-modules
指定要添加到运行时镜像中的模块名称;这些模块可以通过传递依赖关系,导致额外的模块被添加 -
--limit-modules
限制可观测模块的范围 -
--output
是包含生成的运行时镜像的目录路径
--module-path
、--add-modules
和 --limit-modules
选项在 JEP 261 中有更详细的描述。
jlink
将支持的其他选项包括:
--help
打印使用/帮助信息--version
打印版本信息
替代方案
链接工具的替代方法是使用特定于平台的 JDK 和 JRE 镜像构建脚本。这种方法将使得创建自定义运行时镜像变得困难。
测试
除了用于测试工具 I 的预期单元测试集之外,JDK 构建过程还会通过创建 JDK 和 JRE 运行时镜像来定期测试 jlink
。
风险与假设
该工具的需求集合目前尚未完成。预计该工具的可扩展性将会不断发展。
依赖
-
本 JEP 依赖于将由 JSR 376(Java 平台模块系统) 指定,并由 JEP 261:模块系统 实现的模块系统。
-
JDK 9 中 JEP 220 的初始实现使用自定义的构建时工具来构建 JRE 和 JDK 镜像。该工具将被
jlink
取代。