jmod 命令

Name

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

概要

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

包括以下内容:

Main operation modes

create
创建一个新的 JMOD 归档文件。
extract
从 JMOD 存档文件中提取所有文件。
list
打印所有条目的名称。
describe
打印模块详细信息。
hash
确定叶模块并记录直接和间接需要它们的依赖项的哈希值。

Options

options
参见 jmod 的选项

Required

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

Description

Note: 对于大多数开发任务,包括在模块路径上部署模块或将它们发布到 Maven 存储库,继续将模块打包到模块化 JAR 文件中。 jmod 工具用于具有本机库或其他配置文件的模块,或者用于您打算使用 jlink 工具链接到运行时映像的模块。

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

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

使用 --hash-modules 选项或 jmod hash 命令,您可以在每个模块的描述符中记录允许依赖它的模块内容的哈希值,从而将这些模块“捆绑”在一起。这使得包可以导出到一个或多个特定命名的模块,而不会通过合格的导出导出到其他模块。运行时验证记录的模块哈希值是否与运行时解析的哈希值相匹配;如果不是,运行时将返回一个错误。

jmod 的选项

--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

有关 glob-pattern 的语法,请参阅 FileSystem.getPathMatcher 方法。请参阅 Pattern 类以了解 regex-pattern 的语法,它表示正则表达式。

--hash-modules regex-pattern
根据与给定 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 "10.10.5" greetingsmod 

jmod的额外选项

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

--do-not-resolve-by-default
从默认的根模块集中排除
--warn-if-resolved
提示工具在模块已解决时发出警告。已弃用、已弃用以移除或正在孵化中的一种。

jmod 创建示例

以下是创建 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 "10.10.5" greetingsmod 

jmod 哈希示例

以下示例演示当您尝试将叶模块(在此示例中为 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 {
      } 
  2. 为每个模块创建一个 JMOD 档案。创建目录 jmodhashex/jmodsjmodhashex2/jmods ,然后从 jmodhashex 目录运行以下命令,然后从 jmodhashex2 目录运行:

    • jmod create --class-path mods/ma jmods/ma.jmod

    • jmod create --class-path mods/mb jmods/mb.jmod

  3. 可选择预览 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 的哈希值。

  4. jmodhashex 目录中包含的 JMOD 存档文件中记录散列值。从 jmodhashex 目录运行以下命令:

    jmod hash --module-path jmods --hash-modules .*

    该命令打印以下内容:

    Hashes are recorded in module mb

  5. 打印有关 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 
  6. 尝试创建包含目录 jmodhashex2 中的模块 ma 但包含目录 jmodhashex 中的模块 mb 的运行时映像。从 jmodhashex2 目录运行以下命令:

    • Linux and OS X:

      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