Процесс разрешения столкновений

Я создал новый проект с

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-версий.

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

  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 выбрал? Я могу "предположить", что он подобрал предыдущий - но как я могу знать наверняка?

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

1 ответ

Решение

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

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

Другие вопросы по тегам