2013-06-08 3 views
1

나는 내가 project.clj에 다음을 넣어 가지고Clojure의 lein 항아리 충돌 해결 절차

lein new jar-clash-test 
cd jar-clash-test/ 

와 함께 새로운 프로젝트를 생성 한

나는 단지-충돌 테스트에서 다음을 뒀다
(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 
) 

내가

이것을 실행
(ns jar-clash-test.core 
    (:require [io.pedestal.service.http :as bootstrap])) 

/src/jar_clash_test/core.clj

내가 볼 때

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

가 : 라인 (46)에

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

내가 볼 : 0

lein repl 

나는 다음과 같은 오류가 요구 사항에 정의되어

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

예 :

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

즉, 링 미들웨어 병을 가져 오려고합니다.

내 가설은 링 미들웨어 구현을위한 jar 버전 충돌이 있다는 것입니다.

  1. [compojure "1.1.3"] [갖는 의존성] 링/링 코어 "1.1.5"]에 2
  2. [io.pedestal/:

    는에 기초 pedestal.service "0.1.2"는 [3 [링/링 코어 "1.2.0-β1"]에 종속

I은 ​​보면 :

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

기능이

(defn content-type-response 

이 있습니다. 내가 볼 때 :

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

기능이 존재하지 않습니다.

내 질문은 - 내가 어떤 버전의 픽업을 가져 왔는지 어떻게 알 수 있습니까? 나는 그것이 이전의 것을 집어 올렸다고 '추측'할 수있다 - 그러나 내가 어떻게 알 수 있을까?

나의 두 번째 질문은 - 내가 어떤 것을 고를지를 ​​어떻게 보장 할 수 있는가?

답변

1

lein classpath을 말하면 프로젝트의 클래스 경로 계산 된 값을 출력 할 수 있습니다. 이전 항아리가 승리합니다. 또 다른 방법은 REPL에서 (System/getProperty "java.class.path")의 값을 검사하는 것입니다.

간접적 종속성의 버전을 수동으로 선택하려면 직접 지정하십시오. 즉, project.clj에 추가하십시오. 이 항목은이 프로젝트의 컨텍스트에서 종속성의 선택을 무시합니다. 또는 간접 종속성을 끌어들이는 의존성 중 하나를 제외한 모든 것에 을 추가 할 수 있습니다.

+0

어디에서 의존성이로드되는지 쉽고 빠르게 보려면'lein deps : tree'를 사용하십시오. –

+0

필자는 특별히 요청한 버전이 아닌 간접적 인 종속성을 사용하는 버전을 사용하고 있습니다 (clojure 1.4를 요청했습니다. 종속성 중 하나는 1.3을 요구하고 1.3은 런타임에 사용됨). 특정 lib가 사용되도록 보장하는 신뢰할 수있는 유일한 방법은 유치원과 배타적 인 방법입니다 – noisesmith