Clojure如何查找和管理依赖关系冲突。

时间:2018-09-21 10:53:19

标签: clojure dependencies leiningen

我最近遇到一个问题,在我的项目中包含一个新的依赖项会破坏另一个不相关的依赖项的功能。

有问题的两个:

pager.to_a
#=> [1, 1, 2, 1, 2, 3]

包括上述条纹会破坏亚马逊,并为s3操作抛出以下错误

[amazonica "0.3.132"]
[abengoa/clj-stripe "1.0.4"]

删除带区库可修复Amazon的带区库,因此我开始怀疑那里存在某种冲突。我的问题是如何找出导致问题的原因并解决。

我在仓库中发现了类似的问题:https://github.com/mcohen01/amazonica/issues/294

使用

固定的
ERROR org/apache/http/conn/SchemePortResolver
java.lang.NoClassDefFoundError: org/apache/http/conn/SchemePortResolver
    at com.amazonaws.http.apache.client.impl.ApacheHttpClientFactory.<init>(ApacheHttpClientFactory.java:41)

但是我想知道如何能够找到导致问题的Stripe库中的内容,以及如何在不破坏库的情况下进行修复。我也对如何执行此操作的更一般的想法感兴趣,因此,如果我再次遇到它,可以解决此问题。

2 个答案:

答案 0 :(得分:1)

如果您使用的是Leiningen,则可以使用lein deps :tree打印有用的调试信息,并且在打印依赖关系树之前,它将打印建议的排除项,以避免这些类型的问题:

$ lein deps :tree
...
[com.taoensso/faraday "1.9.0"] -> [com.taoensso/encore "2.67.2"] -> [com.taoensso/truss "1.3.3"]
overrides
[amazonica "0.3.112" :exclusions [com.amazonaws/amazon-kinesis-client com.amazonaws/aws-java-sdk com.amazonaws/dynamodb-streams-kinesis-adapter]] -> [com.taoensso/nippy "2.12.2"] -> [com.taoensso/encore "2.68.0"] -> [com.taoensso/truss "1.3.4"]

Consider using these exclusions:
[amazonica "0.3.112" :exclusions [com.amazonaws/amazon-kinesis-client com.taoensso/truss com.amazonaws/dynamodb-streams-kinesis-adapter com.amazonaws/aws-java-sdk]]
...

根据我的经验,排除精确的传递冲突仍涉及一些反复试验。我在AWS开发工具包,杰克逊(Jackson)等方面也遇到过类似的问题。

答案 1 :(得分:1)

由于存在类似问题,因此没有真正的灵丹妙药。在leiningen项目中发现问题的最佳开始是运行deps任务。例如:

lein deps :tree

例如随机项目中的结果如下:

Possibly confusing dependencies found:
[org.clojure/clojurescript "1.9.293"] -> [org.clojure/tools.reader "1.0.0-beta3"]
 overrides
[cljfmt "0.6.0" :exclusions [org.clojure/clojure]] -> [rewrite-cljs "0.4.4"] -> [org.clojure/tools.reader "1.0.5"]
 and
[cljfmt "0.6.0" :exclusions [org.clojure/clojure]] -> [org.clojure/tools.reader "1.2.2"]

Consider using these exclusions:
[cljfmt "0.6.0" :exclusions [org.clojure/clojure org.clojure/tools.reader]]

这些都是开始的提示。在该初始块之后,您将看到整个传递树的树。例如:

[cljfmt "0.6.0" :exclusions [[org.clojure/clojure]]]
  [com.googlecode.java-diff-utils/diffutils "1.3.0"]
  [org.clojure/tools.cli "0.3.7"]
  [rewrite-clj "0.6.0"]
  [rewrite-cljs "0.4.4"]

您可以尝试从那里进行更多调查。