You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非模块化JavaFX应用执行jdeps报MultiReleaseException异常求助

问题根因
  • 多版本Jar校验规则变化:Liberica JDK17对多版本Jar的校验逻辑远严格于JDK14/15,你指定--multi-release 11,但依赖中部分多版本Jar(含jackson-core 2.13.0)包含高于Java 11的版本化类文件,且存在模块声明的版本冲突,直接触发MultiReleaseException。
  • 通配符解析异常:脚本中类路径使用*通配符时,Linux Shell如果匹配不到Jar文件会直接将*作为字符串传递给jdeps,导致类路径解析失败,进一步触发多版本校验异常。
  • 自动模块识别逻辑差异:JDK17的jdeps执行--print-module-deps时,默认仅扫描JDK内置模块,不会将类路径下的自动模块(如仅配置了自动模块名的slf4j Jar)纳入模块解析范围。而gmapsfx为显式模块化Jar,声明了requires org.slf4j,因此触发模块未找到报错。
  • 强制校验逻辑限制:jackson-core 2.13.0为标准多版本Jar,内置了多版本适配的类文件,jdeps扫描到这类Jar时强制要求指定--multi-release参数,无法跳过该校验。
解决方案
  1. 先修正类路径通配符问题,避免Shell解析异常:
    提前将所有依赖Jar的路径拼成类路径变量,避免直接使用通配符:
CLASSPATH="$(find ~/path/to/app/target/package/libs/ -name "*.jar" | tr '\n' ':'):target/classes"
  1. 调整jdeps参数适配JDK17的校验规则:
  • 将--multi-release参数值改为17,和当前使用的JDK版本对齐,避免多版本Jar的版本适配冲突
  • 新增--module-path参数指定依赖Jar目录,让jdeps可以自动识别目录下的自动模块
  • 新增--add-modules ALL-MODULE-PATH参数,强制jdeps将所有自动模块纳入解析范围,解决slf4j模块找不到的问题

最终可用的jdeps命令参考:

~/path/to/jdk/bin/jdeps -q \
  --multi-release 17 \
  --ignore-missing-deps \
  --print-module-deps \
  --module-path ~/path/to/app/target/package/libs/ \
  --add-modules ALL-MODULE-PATH \
  --class-path target/classes \
  target/classes/ch/cnlab/uxtest/MainKt.class
  1. 附加优化项:
    如果仍出现多版本相关异常,可将--ignore-missing-deps替换为JDK17更规范的参数--missing-deps=ignore。后续执行jlink构建自定义运行时,记得添加--bind-services参数,确保所有依赖的服务提供者都被纳入运行时,避免JavaFX组件或其他依赖加载失败。

内容的提问来源于stack exchange,提问作者dzim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:54:03