在 Clojure 中正确导入 Apache Storm 依赖项

Properly importing Apache Storm dependencies in Clojure

我正在尝试在我的 Clojure 项目中使用 Apache Storm 和 Redis。我的 project.clj 看起来像这样:

(defproject storm "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]
                 [org.apache.storm/storm-core "0.9.5"]
                 [com.taoensso/carmine "2.11.1"] ])

Redis 连接器模块中的命名空间声明为:

(ns storm.redis
  (:require [taoensso.carmine :as car]))

现在,出于某种原因,如果我尝试计算上述名称空间声明,我会收到一个奇怪的错误:

CompilerException java.lang.Exception: namespace 'taoensso.carmine' not found, compiling:(storm/redis.clj:1:22)

如果我将 project.clj 中的 Storm 依赖项修改为

[storm "0.9.0.1"] ; Last available version on Clojars

然后一切正常。我做错了什么?

我想我找到了解决办法。 运行 lein deps :tree 给了我这个:

Possibly confusing dependencies found:
[org.apache.storm/storm-core "0.9.5"] -> [commons-codec "1.6"]
 overrides
[com.taoensso/carmine "2.11.1"] -> [commons-codec "1.10"]

Consider using these exclusions:
[com.taoensso/carmine "2.11.1" :exclusions [commons-codec]]

carmine 中排除 commons-codec 仍然产生相同的错误,但反之亦然,从 storm 中排除有效:

[org.apache.storm/storm-core "0.9.5" :exclusions [commons-codec]]

所以这意味着两个库都将使用更新版本的 commons-codec

似乎 carmine 由于依赖项的版本较低而未能自行初始化 (?)。这只是一个猜想,因为我不知道如何调试那些库初始化例程。

更新: Carmine 库的作者 Peter Taoussanis 对此做出回应 GitHub issue 确认这是一个依赖性问题,并建议了一些其他修复类似问题的方法问题。谢谢彼得!