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

Clojure项目升级ring-json至0.5.1后jdeps/jlink报错如何修复

问题根因

ring-json 从0.5.1版本开始将依赖的Jackson库升级到了2.12及以上版本,新版Jackson的各个组件jar包都内置了JPMS(Java平台模块系统)的模块描述文件module-info.class,会显式声明自身模块名和依赖的其他模块。
Leiningen打uberjar时的默认逻辑是把所有依赖jar解压后平铺重打包,遇到同名文件直接覆盖。所有依赖jar里的module-info.class路径完全一致,打包后只会保留最后一个被解压的jar的模块描述文件,其他依赖的模块声明会全部丢失。
报错的直接原因是最终uberjar里残留了jackson-dataformat-smile的模块声明(显式依赖com.fasterxml.jackson.core模块),但jackson-core对应的模块声明已经被覆盖丢失,jdeps执行模块解析时找不到对应依赖就会直接抛出异常。注意--ignore-missing-deps参数仅忽略普通类依赖的缺失,不会跳过module-info里显式声明的模块依赖校验。
程序本身运行不受影响,是因为普通java -jar走classpath模式时根本不会读取这些module-info文件,只有jdeps、jlink这类会识别JPMS模块的工具才会触发这个问题。

修复方案

针对这类非模块化Clojure项目场景,最一劳永逸的方法是打包时直接剔除所有多余的module-info文件,从根源避免模块解析冲突:

  • 修改project.clj配置,添加uberjar文件排除规则,剔除所有依赖里的模块描述文件:
(defproject testjackson "0.1.0-SNAPSHOT"
  :main testjackson.core
  ;; 新增uberjar排除规则
  :uberjar-exclusions [#"^META-INF/module-info\.class$"
                       #"^META-INF/versions/\d+/module-info\.class$"]
  :dependencies [[org.clojure/clojure "1.10.3"]
                 [ring/ring-json "0.5.1"]])
  • 清理旧构建产物,重新打uberjar:
lein clean
lein uberjar
  • 重新执行原jdeps命令即可正常输出模块依赖列表,和ring-json 0.5.0版本的执行结果一致。

这个修改不会对程序运行产生任何副作用:绝大多数Clojure项目都不会使用JPMS模块化机制,这些第三方依赖自带的module-info文件在uberjar里属于冗余内容,剔除后反而能避免很多类似的工具兼容性问题。

如果不想修改项目打包配置,也可以在执行jdeps时追加--class-path target/testjackson-0.1.0-SNAPSHOT-standalone.jar参数,强制jdeps走类路径分析模式绕过模块解析错误,只是每次执行命令都需要加该参数,便捷性不如修改打包配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:06:25