jlink可将java应用及其依赖模块与jvm打包为精简独立运行时镜像;需按模块化与否明确指定所需模块,配合jdeps分析依赖,用--add-modules等参数构建,再通过jpackage生成原生安装包。

Java 11 引入的 jlink 工具可以将应用依赖的模块和 JVM 运行时打包成一个精简、独立、可直接运行的自定义运行时镜像,无需用户额外安装 JDK/JRE。关键在于明确应用所需模块(而非盲目包含全部),并确保类路径与模块路径正确。
确认应用是否为模块化(是否含 module-info.class)
非模块化应用(传统 jar + classpath)也能用 jlink,但需额外指定启动类和依赖模块;模块化应用(含 module-info.java)更易自动推导依赖。
- 若已模块化:编译后确保
module-info.class在模块根路径下,且requires声明完整(如requires java.base; requires javafx.controls;) - 若未模块化:jlink 无法自动识别依赖,必须手动列出所有需要的模块(常用如
java.base、java.desktop、java.logging等),可通过jdeps --list-deps your-app.jar辅助分析
使用 jlink 构建最小运行时镜像
基本命令结构如下,注意路径、模块名和输出目录需按实际调整:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
jlink \ --module-path "mods:$(JAVA_HOME)/jmods" \ --add-modules your.module.name,java.base,java.desktop \ --output ./my-runtime \ --strip-debug \ --compress 2 \ --no-header-files \ --no-man-pages
-
--module-path:指定模块所在路径,mods/是你编译出的模块 jar 或目录,$(JAVA_HOME)/jmods是 JDK 自带的可链接 jmod 文件(Linux/macOS)或%JAVA_HOME%\jmods(Windows) -
--add-modules:显式声明要包含的模块。至少包含java.base;GUI 应用加java.desktop;日志加java.logging;网络加java.net.http(Java 11+)等 -
--strip-debug:移除调试信息,减小体积 -
--compress 2:启用字节码压缩(级别 1–3),推荐 2 -
--no-header-files和--no-man-pages:避免打包头文件和手册页,适合最终分发
运行打包后的镜像并验证
生成的 my-runtime 目录即为完整运行时,含 bin/java(或 bin\java.exe)可执行文件:
- 模块化应用启动:
./my-runtime/bin/java -m your.module.name/your.MainClass - 非模块化 jar 启动:
./my-runtime/bin/java -cp your-app.jar your.MainClass - 验证是否精简:对比
my-runtime/jmods/内容,应只含你声明的模块;总大小通常为 30–60 MB(远小于完整 JRE 的 100+ MB) - 若报
ClassNotFoundException或NoClassDefFoundError,说明漏加了某模块,用jdeps --verbose your-app.jar查缺补漏
进阶建议:结合 jpackage(Java 14+)生成原生安装包
jlink 输出的是运行时目录,若需 .exe/.dmg/.deb 等安装包,可搭配 jpackage:
jpackage \ --input . \ --name MyApp \ --main-jar your-app.jar \ --main-class your.MainClass \ --runtime-image ./my-runtime \ --type exe
-
--runtime-image指向 jlink 生成的目录,避免重复打包运行时 - 支持 Windows(exe/msi)、macOS(dmg/pkg)、Linux(deb/rpm)等多种格式
- 生成的安装包自带启动脚本、图标、注册表(Windows)或服务配置(Linux),用户体验更接近原生应用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










