系列中的上一篇
当前教程
Jmod - 创建 JMOD 存档

Jmod - 创建 JMOD 存档

 

介绍 jmod

jmod - 创建 JMOD 文件并列出现有 JMOD 文件的内容

 

概要

jmod (create|extract|list|describe|hash) [options] jmod-file

包括以下内容

主要操作模式

create 创建一个新的 JMOD 存档文件。

extract 从 JMOD 存档文件中提取所有文件。

list 打印所有条目的名称。

describe 打印模块详细信息。

hash 确定叶子模块并记录直接和间接依赖它们的依赖项的哈希值。

选项

options 查看 jmod 的选项。

必需

jmod-file 指定要创建的 JMOD 文件的名称或从中检索信息的 JMOD 文件的名称。

 

描述

JMOD 文件格式允许您聚合除 .class 文件、元数据和资源之外的其他文件。此格式是可移植的,但不可执行,这意味着您可以在编译时或链接时使用它,但不能在运行时使用。

许多 jmod 选项都涉及指定一个路径,其内容将被复制到生成的 JMOD 文件中。这些选项会复制指定路径的所有内容,包括子目录及其内容,但会排除名称与 --exclude 选项指定的模式匹配的文件。

使用 --hash-modules 选项或 jmod hash 命令,您可以在每个模块的描述符中记录允许依赖它的模块内容的哈希值,从而将这些模块“绑定”在一起。这使得一个包可以通过限定导出导出到一个或多个特定命名的模块,而不能导出到其他模块。

运行时会验证记录的模块哈希值是否与运行时解析的哈希值匹配;如果不匹配,运行时会返回错误。

 

选项

--class-path path 指定应用程序 JAR 文件的位置或包含要复制到生成的 JMOD 文件中的类的目录。

--cmds path 指定要复制到生成的 JMOD 文件中的本机命令的位置。

--config path 指定要复制到生成的 JMOD 文件中的用户可编辑配置文件的位置。

–-dir path 指定 jmod 从指定的 JMOD 存档中提取文件的位置。

--dry-run 执行哈希模式的干运行。它识别叶子模块及其所需模块,但不记录任何哈希值。

--exclude pattern–list 排除与提供的逗号分隔的模式列表匹配的文件,每个元素使用以下形式之一

glob-pattern

glob:glob-pattern

regex:regex-pattern

--hash-modules regex-pattern 确定叶子模块并记录直接和间接依赖它们的依赖项的哈希值,这些依赖项基于与给定正则表达式模式匹配的模块的模块图。哈希值将记录在正在创建的 JMOD 存档文件中,或者记录在 jmod hash 命令指定的模块路径上的 JMOD 存档或模块化 JAR 中。

--header-files path 指定要复制到生成的 JMOD 文件中的头文件的位置。

--help-h 打印使用信息。

--help-extra 打印额外选项的帮助信息。

–-legal-notices path 指定要复制到生成的 JMOD 文件中的法律声明的位置。

--libs path 指定要复制到生成的 JMOD 文件中的本机库的位置。

--main-class class-name 指定要在 module-info.class 文件中记录的主类。

--man-pages path 指定要复制到生成的 JMOD 文件中的手册页的位置。

--module-version module-version 指定要在 module-info.class 文件中记录的模块版本。

--module-path path-p path 指定模块路径。如果您还指定了 --hash-modules,则此选项是必需的。

--target-platform platform 指定目标平台。

--version 打印 jmod 工具的版本信息。

@filename 从指定的文件中读取选项。

选项文件是一个文本文件,其中包含您通常在命令提示符中输入的选项和值。选项可以出现在一行上,也可以出现在多行上。您不能为路径名指定环境变量。您可以通过在行首添加井号 (#) 来注释掉行。

以下是 jmod 命令的选项文件示例

#Wed Dec 07 00:40:19 EST 2016
create --class-path mods/com.greetings --module-path mlib
  --cmds commands --config configfiles --header-files src/h
  --libs lib --main-class com.greetings.Main
  --man-pages man --module-version 1.0
  --os-arch "x86_x64" --os-name "Mac OS X"
  --os-version "11.2.3" greetingsmod

 

额外选项

除了在 jmod 的选项中描述的选项之外,以下是一些可以与命令一起使用的额外选项。

--do-not-resolve-by-default 从模块的默认根集排除

--warn-if-resolved 提示工具在解析模块时发出警告。其中之一是已弃用、已弃用以供删除或正在孵化。

 

示例

以下是创建 JMOD 文件的示例

jmod create --class-path mods/com.greetings --cmds commands
  --config configfiles --header-files src/h --libs lib
  --main-class com.greetings.Main --man-pages man --module-version 1.0
  --os-arch "x86_x64" --os-name "Mac OS X"
  --os-version "11.2.3" greetingsmod 

以下示例演示了当您尝试将叶子模块(在本例中为 ma)与所需模块(mb)链接时会发生什么,并且所需模块中记录的哈希值与叶子模块的哈希值不匹配。

  1. 创建并编译以下 .java 文件
  • jmodhashex/src/ma/module-info.java
module ma {
  requires mb;
}
  • jmodhashex/src/mb/module-info.java
module mb {
}
  • jmodhashex2/src/ma/module-info.java
module ma {
  requires mb;
}
  • jmodhashex2/src/mb/module-info.java
module mb {
}
  1. 为每个模块创建一个 JMOD 存档。创建目录 jmodhashex/jmodsjmodhashex2/jmods,然后从 jmodhashex 目录运行以下命令,然后从 jmodhashex2 目录运行以下命令
jmod create --class-path mods/ma jmods/ma.jmod
jmod create --class-path mods/mb jmods/mb.jmod
  1. 可以选择预览 jmod hash 命令。从 jmodhashex 目录运行以下命令
jmod hash --dry-run -module-path jmods --hash-modules .*

该命令会打印以下内容

Dry run:
mb
  hashes ma SHA-256 07667d5032004b37b42ec2bb81b46df380cf29e66962a16481ace2e71e74073a

这表明 jmod hash 命令(不带 --dry-run 选项)将在模块 mb 中记录叶子模块 ma 的哈希值。

  1. jmodhashex 目录中包含的 JMOD 存档文件中记录哈希值。从 jmodhashex 目录运行以下命令
jmod hash --module-path jmods --hash-modules .*

该命令会打印以下内容

Hashes are recorded in module mb
  1. 打印 jmodhashex 目录中包含的每个 JMOD 存档的信息。从 jmodhashex 目录运行突出显示的命令
jmod describe jmods/ma.jmod

ma
  requires mandated java.base
  requires mb

jmod describe jmods/mb.jmod

mb
  requires mandated java.base
  hashes ma SHA-256 07667d5032004b37b42ec2bb81b46df380cf29e66962a16481ace2e71e74073a
  1. 尝试创建一个包含来自 jmodhashex2 目录的模块 ma 但包含来自 jmodhashex 目录的模块 mb 的运行时映像。从 jmodhashex2 目录运行以下命令

Linux 和 macOS

jlink --module-path $JAVA_HOME/jmods:jmods/ma.jmod:../jmodhashex/jmods/mb.jmod --add-modules ma --output ma-app

Windows

jlink --module-path %JAVA_HOME%/jmods;jmods/ma.jmod;../jmodhashex/jmods/mb.jmod --add-modules ma --output ma-app

该命令会打印类似于以下内容的错误消息

Error: Hash of ma (a2d77889b0cb067df02a3abc39b01ac1151966157a68dc4241562c60499150d2) differs to
expected hash (07667d5032004b37b42ec2bb81b46df380cf29e66962a16481ace2e71e74073a) recorded in mb

上次更新: 2021 年 9 月 14 日


系列中的上一篇
当前教程
Jmod - 创建 JMOD 存档