【问题标题】:Clojure How To Find and Manage Dependency conflicts.Clojure 如何查找和管理依赖冲突。
【发布时间】:2019-02-25 18:31:15
【问题描述】:

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

有问题的两个:

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

包含上述条纹会破坏亚马逊的条纹,并为 s3 操作引发以下错误

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)

删除条带库修复了亚马逊的条带库,所以我开始怀疑那里存在某种冲突。我的问题是如何找出导致问题的原因并解决它。

我在 repo 上发现了一个类似的问题:https://github.com/mcohen01/amazonica/issues/294

已用

修复
[clj-facebook-graph "0.4.0" :exclusions [clj-http]]

但我想知道如何找出导致问题的 Stripe 库中的内容,以及如何在不破坏库的情况下进行修复。我也对如何做到这一点的更一般的想法感兴趣,所以如果我再次遇到它,我可以解决这个问题。

【问题讨论】:

    标签: clojure dependencies leiningen


    【解决方案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 SDK、Jackson 等时也遇到过类似的问题。

    【讨论】:

      【解决方案2】:

      由于遇到这样的问题,没有真正的灵丹妙药。在 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]]
      

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

      [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"]
      

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

      【讨论】:

        猜你喜欢
        • 2014-12-16
        • 1970-01-01
        • 2021-09-03
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        相关资源
        最近更新 更多