1

我创建了一个新项目

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]

这意味着它正在尝试引入 ring-middleware 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"]

当我看:

/.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 选择了哪个版本?我可以“假设”它已经拿起了前一个——但我怎么能确定呢?

我的第二个问题是 - 我如何保证会选择哪一个?

4

1 回答 1

1

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

如果你想手动选择一个间接依赖的版本,让它直接,也就是说,将它添加到你的project.clj; 然后,此条目将覆盖此项目上下文中依赖项的选择。或者,您可以添加:exclusions除一个依赖项之外的所有依赖项,这会导致引入间接依赖项。

于 2013-06-08T13:43:58.657 回答