【问题标题】:Can I force lein to ignore dependencies from any code external to current Clojure project?我可以强制 lein 忽略当前 Clojure 项目外部任何代码的依赖关系吗?
【发布时间】:2019-03-28 14:43:09
【问题描述】:

我在一个我无法完全控制的大型 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

有没有一种方法可以忽略源自我的 Clojure 代码之外的冲突,在 lein(或其他)中?

【问题讨论】:

  • 出了什么问题?错误信息是什么?
  • java.lang.Exception: 应用程序脚本抛出异常:java.lang.NoSuchFieldError: INSTANCE BSF info: Get dimension data at line: 0 column: columnNo

标签: clojure leiningen


【解决方案1】:

有必要克服冲突并解决它们。有两种方法:

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

  • 托管依赖项: 您还可以将managed-dependencies 部分添加到您的 project.clj 中,您可以在其中指定将使用的库的确切版本,而不管其他传递依赖项的解析。这是一种更生硬的乐器,我倾向于使用这种乐器。

一个项目中的随机示例:

  :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 解决方法,它太具体了,不值得分享,所以在 mo 没有机会对此进行调查。 :managed-dependencies 是否会防止与 lein 引入的类路径中碰巧在类路径中的相同依赖项的其他版本发生冲突?
  • 是的,托管依赖项最后应用,因为 lein 正在构建类路径。据我了解,它拥有最终决定权,除非您传递手动破坏类路径的 JVM 选项
猜你喜欢
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多