非模块化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参数,无法跳过该校验。
解决方案
- 先修正类路径通配符问题,避免Shell解析异常:
提前将所有依赖Jar的路径拼成类路径变量,避免直接使用通配符:
CLASSPATH="$(find ~/path/to/app/target/package/libs/ -name "*.jar" | tr '\n' ':'):target/classes"
- 调整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
- 附加优化项:
如果仍出现多版本相关异常,可将--ignore-missing-deps替换为JDK17更规范的参数--missing-deps=ignore。后续执行jlink构建自定义运行时,记得添加--bind-services参数,确保所有依赖的服务提供者都被纳入运行时,避免JavaFX组件或其他依赖加载失败。
内容的提问来源于stack exchange,提问作者dzim
相关产品推荐
相关产品推荐

