JDK 9 jlink执行报错‘--output must be specified’,求问题排查
解决jlink报错"Error: --output must be specified"的问题
嘿,我来帮你排查这个问题~ 你遇到的这个报错看似矛盾——明明已经写了--output out,却还是提示必须指定它,核心问题出在模块路径的分隔符使用错误,另外还有几个小细节可以优化:
错误原因分析
你用了分号;来分隔模块路径里的${JAVA_HOME}/jmods和mlibs/reader@1.0.jar,但这个分隔符的兼容性很关键:
- 如果你在Windows的cmd/PowerShell里执行命令,分号
;确实是正确的模块路径分隔符,但你没必要单独指定reader@1.0.jar,直接指向存放所有模块化jar的mlibs目录更合理; - 如果你在Linux/macOS的bash/zsh等类Unix shell里执行,分号
;会被当成命令结束符——shell会把${JAVA_HOME}/bin/jlink --module-path ${JAVA_HOME}/jmods当成一个独立命令执行,这个命令里没有--output参数,自然就会报错。
修正后的jlink命令
根据你的操作系统选择对应的命令:
1. Windows系统
%JAVA_HOME%\bin\jlink --module-path %JAVA_HOME%\jmods;mlibs --add-modules decoder --output out
2. Linux/macOS系统
${JAVA_HOME}/bin/jlink --module-path ${JAVA_HOME}/jmods:mlibs --add-modules decoder --output out
额外优化建议
- 模块路径指向目录而非单个jar:把
mlibs目录加到模块路径里,jlink会自动扫描目录下的所有模块化jar,自动处理模块间的依赖(比如decoder依赖reader),不用手动指定单个jar; - 指定主模块而非依赖模块:你的应用入口是
Decoder类,所以--add-modules应该指定decoder模块,jlink会自动把它依赖的reader模块也包含到自定义运行时里; - 确保你的jar是模块化jar:你之前打包的
decoder.jar和reader@1.0.jar已经包含了module-info.class,这部分是没问题的。
内容的提问来源于stack exchange,提问作者user3532588
相关产品推荐
相关产品推荐

