jmod工具专用于构建仅在编译期和链接期使用的jmod文件,不替代jar,适用于打包本地库、头文件、脚本等以配合jlink构建自定义运行时镜像。

jmod 工具不是用来替代 JAR 的通用打包工具,它专用于构建 JMOD 文件——一种仅在编译期和链接期使用的模块容器格式,不能直接运行。它主要服务于需要打包本地库(.so/.dll)、头文件、配置脚本或配合 jlink 构建自定义运行时镜像的场景。
什么时候该用 jmod?
你不需要用 jmod 来部署普通应用模块到模块路径(--module-path)或发布到 Maven 仓库——这些仍应使用 模块化 JAR(即带 module-info.class 的 JAR)。jmod 的典型用途包括:
- 为含 native 库的模块(如 JNI 绑定)准备可被
jlink消费的输入 - 打包 C 头文件(
include/)、命令行工具(bin/)、动态库(lib/)等非 class 资源 - 构建 JDK 自定义子集时,替换或扩展标准模块(如
java.base.jmod)
打包:jmod create 基本用法
假设你已编译好模块类(位于 mods/myapp),并有配套资源:
- 本地库:./native/libmylib.so
- 命令行脚本:./scripts/myapp.sh
- 配置文件:./conf/app.conf
- 头文件:./include/myapp.h
执行以下命令生成 myapp.jmod:
注意:--class-path 是必选项,指定 .class 文件所在目录;其他路径选项会递归复制整个目录结构进 JMOD。
解压:jmod extract 查看或还原内容
想查看 JMOD 里实际包含哪些文件,或提取出来做检查,用 extract:
默认解压到当前目录。若要指定目标目录,需配合 --dir:
解压后你会看到类似这样的结构:
-
classes/(对应 --class-path 内容) -
libs/(来自 --libs) -
cmds/(来自 --cmds) -
conf/(来自 --config) -
headers/(来自 --header-files)
辅助操作:list、describe、hash
快速验证 JMOD 是否符合预期:
-
jmod list myapp.jmod—— 列出所有条目路径(如classes/com/example/Main.class) -
jmod describe myapp.jmod—— 显示模块名、版本、导出包、依赖项等元信息 -
jmod hash --hash-modules "java.base|myapp" myapp.jmod—— 在模块描述符中写入指定模块的哈希值,用于运行时强绑定校验(启用 qualified exports 后生效)
运行时不会加载 JMOD 文件本身;它必须先通过 jlink 链接到 JIMAGE 运行时镜像中,才能被 JVM 使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











