clojure lein jar冲突解决过程

时间:2013-06-08 11:20:12

标签: jar clojure version leiningen name-clash

我用

创建了一个新项目
lein new jar-clash-test
cd jar-clash-test/

我已将以下内容放在project.clj

(defproject jar-clash-test "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.5.0"]
                 [io.pedestal/pedestal.service "0.1.2"]
                 ...]
  :main ^{:skip-aot true} jar-clash-test.core
)

我在jar-clash-test / src / jar_clash_test / core.clj中添加了以下内容

(ns jar-clash-test.core
  (:require [io.pedestal.service.http :as bootstrap]))

当我用

运行时
lein repl

我收到以下错误:

CompilerException java.lang.RuntimeException: No such var: content-type/content-type-response, compiling:(io/pedestal/service/http/ring_middlewares.clj:46:3)

当我看到:

/.m2/repository/io/pedestal/pedestal/0.1.2/pedestal.service-0.1.2/io/ring_middlewares.clj

在第46行,我看到:

  (leave-interceptor ::content-type-interceptor content-type/content-type-response opts))

在要求中定义为:

[ring.middleware.content-type :as content-type]

这意味着它正试图引入环中间件jar。

我的假设是环形中间件实现存在jar版本冲突。

这基于:

  1. [compojure“1.1.3”] [有一个依赖] 2在[ring / ring-core“1.1.5”]
  2. [io.pedestal / pedestal.service“0.1.2”] [依赖于] 3 [ring / ring-core“1.2.0-beta1”]
  3. 当我看到:

    /.m2/repository/ring/ring-core/1.2.0-beta1/ring-core-1.2.0-beta1/ring/middleware/content_type.clj
    

    功能

    (defn content-type-response
    

    存在。当我看到:

    /.m2/repository/ring/ring-core/1.1.5/ring-core-1.1.5/ring/middleware/content_type.clj
    

    该功能不存在。

    我的问题是 - 我如何知道lein选择了哪个版本?我可以'假设'它已经拿起了早期的 - 但我怎么能肯定地知道呢?

    我的第二个问题是 - 我怎样才能保证哪一个莱恩会选择?

1 个答案:

答案 0 :(得分:1)

您可以说lein classpath获取项目类路径计算值的打印输出。早先的罐子赢了。另一种方法:在REPL中检查(System/getProperty "java.class.path")的值。

如果您想手动选择间接依赖关系的版本,请将其直接删除,即将其添加到project.clj;然后,此条目将覆盖此项目上下文中的依赖项选择。或者,您可以将:exclusions添加到除了一个依赖项之外的所有依赖项,这会导致间接依赖项被拉入。