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

3

我在一个大型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代码之外的冲突?

出了什么问题?错误信息是什么? - Alan Thompson
java.lang.Exception: 应用程序脚本抛出异常:java.lang.NoSuchFieldError: INSTANCE BSF 信息:在行 0 列 columnNo 获取维度数据 - Ooberdan
1个回答

3
需要耐心地解决冲突并修复它们。有两种方法:
  • 排除法: 从每个上游依赖项中排除在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 ...]

感谢Arthur - 我找到了一个hacky的解决方法,但它太具体化了,不值得分享,所以现在没有机会去调查这个问题。:managed-dependencies能否防止来自lein引入的同一依赖项的其他版本在类路径上位于先前位置而引起的冲突? - Ooberdan
是的,管理依赖项是最后应用的,因为 lein 正在构建类路径。据我所知,它有最终决定权,除非您传递 JVM 选项手动篡改类路径。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接