clojure-lein-jar冲突解决过程

clojure-lein-jar冲突解决过程,jar,clojure,version,leiningen,name-clash,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"] ...] :

我已经创建了一个新项目

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\u-clash\u-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
/.m2/repository/ring/ring-core/1.2.0-beta1/ring-core-1.2.0-beta1/ring/middleware/content_type.clj
/.m2/repository/ring/ring-core/1.1.5/ring-core-1.1.5/ring/middleware/content_type.clj
在第46行,我看到:

  (leave-interceptor ::content-type-interceptor content-type/content-type-response opts))
在要求中定义为:

[ring.middleware.content-type :as content-type]
这意味着它正试图把戒指带进来

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

这是基于:

  • [compojure“1.1.3”][依赖于[ring/ring core“1.1.5”]
  • [io.DESTABLE/DESTABLE.service“0.1.2”][依赖于][ring/ring core“1.2.0-beta1”]
  • 当我看到:

    /.m2/repository/io/pedestal/pedestal/0.1.2/pedestal.service-0.1.2/io/ring_middlewares.clj
    
    /.m2/repository/ring/ring-core/1.2.0-beta1/ring-core-1.2.0-beta1/ring/middleware/content_type.clj
    
    /.m2/repository/ring/ring-core/1.1.5/ring-core-1.1.5/ring/middleware/content_type.clj
    
    功能

    (defn content-type-response
    
    存在。当我看到:

    /.m2/repository/io/pedestal/pedestal/0.1.2/pedestal.service-0.1.2/io/ring_middlewares.clj
    
    /.m2/repository/ring/ring-core/1.2.0-beta1/ring-core-1.2.0-beta1/ring/middleware/content_type.clj
    
    /.m2/repository/ring/ring-core/1.1.5/ring-core-1.1.5/ring/middleware/content_type.clj
    
    该函数不存在

    我的问题是-我怎么知道莱恩选择了哪个版本?我可以“假设”它已经选择了较早的一个,但我怎么能确定呢


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

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


    如果您想手动选择间接依赖项的版本,请将其设置为直接,也就是说,将其添加到您的
    项目.clj
    ;然后,此条目将覆盖此项目上下文中依赖项的选择。或者,您可以将
    :排除
    添加到除一个依赖项之外的所有依赖项,这些依赖项会导致间接依赖项被拉入。

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


    如果您想手动选择间接依赖项的版本,请将其设置为直接,也就是说,将其添加到您的
    项目.clj
    ;然后,此条目将覆盖此项目上下文中依赖项的选择。或者,您可以将
    :排除
    添加到除一个依赖项之外的所有依赖项,这些依赖项会导致间接依赖项被拉入。

    要快速方便地查看从何处加载的依赖项,使用
    lein deps:tree
    。我让lein使用一个间接依赖项使用的版本,而不是我特别要求的版本(我要求clojure 1.4,我的一个依赖项要求1.3,1.3在运行时使用)。确保使用特定库的唯一可靠方法是lein pedantic和Exclutions为了快速简便地查看从何处加载的依赖项,请使用
    lein deps:tree
    。我让lein使用的是间接依赖项使用的版本,而不是我特别要求的版本(我要求clojure 1.4,我的一个依赖项要求1.3,1.3在运行时使用)。确保使用特定库的唯一可靠方法是lein pedantic和Exclutions