我正在一个更大的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代码之外产生的冲突?
答案 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 ...]