June 10, 2020
By: Kevin

Leiningen依赖冲突的解决

  1. 现象
  2. 解决方案
  3. 诡异问题

现象

工程有多多个jar依赖的时候, 遇到版本冲突的情况比较普遍. 一般是我们在project.clj中更新一个依赖以后, 发现工程起不来了. 执行 lein deps :tree 能看到类似提示

✗ lein deps :tree
Possibly confusing dependencies found:
[com.taoensso/timbre "4.10.0"] -> [com.taoensso/encore "2.91.0"]
overrides
[com.taoensso/sente "1.15.0"] -> [com.taoensso/encore "2.117.0"]

Consider using these exclusions:
[com.taoensso/sente "1.15.0" :exclusions [com.taoensso/encore]]

解决方案

  1. 调整依赖顺序: 和maven一样, 依赖库的版本以首先遇到版本, 也就是下面A的依赖版本
:dependencies [[library-A-with-OLD-encore-dep "version"] ; A 的的依赖版本更早
               [library-B-with-NEW-encore-dep "version"]]
   :dependencies [[library-B-with-NEW-encore-dep "version"] ; B above A (fixed!)
                  [library-A-with-OLD-encore-dep "version"]]
  1. 明确写明依赖库的版本
:dependencies [[com.taoensso/encore           "latest-version"]
               [library-A-with-OLD-encore-dep "version"]
               [library-B-with-NEW-encore-dep "version"]]

诡异问题

如果遇到修改后的依赖的ns找不到, 尝试用 lein clean 来清除项目编译的中间产物, 然后再来一遍.

Tags: clojure lein