2013-06-08 6 views
1

Я создал новый проект сClojure процесс разрешения Lein банка столкновение

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 
) 

Я поставил следующие в банке-столкновение-тест /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)) 

, который определяется в требованиях as:

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

Это означает, что он пытается принести в кольцо-посредник банку.

Моя гипотеза заключается в том, что существует конфликтная ситуация с банной версией для реализации промежуточного программного обеспечения.

Это основано на:

  1. [compojure "1.1.3"] [имеет зависимость] на [2 кольца/кольцевой сердечник "1.1.5"]
  2. [io.pedestal/pedestal.service "0.1.2"] [имеет зависимость от] 3 [кольцо/кольцо-ядро "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 выбрала? Я могу «предположить», что он взял предыдущий, но как я могу точно знать?

Мой второй вопрос: как я могу гарантировать, какой из лейн выбрать?

ответ

1

Вы можете сказать lein classpath, чтобы получить распечатку вычисленного значения пути к классу для вашего проекта. Ранние банки побеждают. Другой подход: изучить значение (System/getProperty "java.class.path") на REPL.

Если вы хотите выбрать версию косвенной зависимости вручную, сделайте ее прямой, то есть добавьте ее в свой project.clj; эта запись затем переопределяет выбор зависимостей в контексте этого проекта. В качестве альтернативы вы можете добавить :exclusions ко всем, кроме одной из ваших зависимостей, которые заставляют косвенную зависимость втягиваться.

+0

Для быстрого и легкого изучения того, какие зависимости загружаются из того места, используйте 'lein deps: tree'. –

+0

Я использовал lein версию, используемую косвенной зависимостью, а не версию, которую я специально запросил (я попросил clojure 1.4, одна из моих зависимостей запрашивает 1.3, 1.3, которая использовалась во время выполнения). Единственный надежный способ обеспечить конкретную библиотеку lib - это leint pedantic и исключения – noisesmith