我可以强迫lein忽略当前Clojure项目外部任何代码的依赖吗?

时间:2018-10-24 08:49:26

标签: clojure leiningen

我正在一个更大的Java项目中调用一些Clojure(1.8)代码,但我并没有完全控制这些代码。最近,一些代码已添加到父代码中,从而导致与HTTP客户端clj-http发生冲突。

在我的Clojure项目中,这是lein deps :tree|grep http的输出:

[clj-http "3.7.0"]    
  [org.apache.httpcomponents/httpasyncclient "4.1.3" :exclusions [[org.clojure/clojure]]] 
    [org.apache.httpcomponents/httpcore-nio "4.4.6"]    
  [org.apache.httpcomponents/httpclient "4.5.3" :exclusions [[org.clojure/clojure]]]    
  [org.apache.httpcomponents/httpcore "4.4.6" :exclusions [[org.clojure/clojure]]]    
  [org.apache.httpcomponents/httpmime "4.5.3" :exclusions [[org.clojure/clojure]]]

为另一个项目运行mvn dependency:tree|grep http会返回以下内容(请注意,该项目也是父项的子项):

[INFO] +- org.apache.httpcomponents:httpclient:jar:4.1.1:compile
[INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.1:compile

有没有一种方法可以忽略在lein(或其他方式)中Clojure代码之外产生的冲突?

1 个答案:

答案 0 :(得分:1)

有必要解决冲突并加以解决。有两种方法:

  • 排除项: 从提供它的每个上游依赖项中排除在lein deps tree中报告的每个依赖项。当您需要确保不包括传递依赖项时,这可以使您完全控制。它虽然可以……“有点麻烦”;-)

  • 受管依存关系: 您还可以在project.clj中添加一个managed-dependencies部分,在其中您可以指定将使用的库的确切版本,而与其他传递依赖项的解析无关。这是一种比较钝的工具,我倾向于。

一个项目中的随机示例:

  :managed-dependencies [[http-kit "2.3.0"]
                         [org.clojure/clojure "1.9.0"]
                         [ring/ring-core "1.6.0"]
                         [ring/ring-jetty-adapter "1.6.0"]
                         ... lots more ...]