消除 clojure 中的依赖关系

Disambiguating dependencies in clojure

我已经添加了对 Distributions 的依赖 https://clojars.org/distributions

  :dependencies [[org.clojure/clojure "1.10.1"]
                [distributions "0.1.2"]]

当我添加需求时

(ns simulator.core
  (:require [distributions.core :refer :all]))

并做 lein 运行。它疯了。它试图找到一个不同的分发包(一个来自 Incanter,但我没有在任何地方引用 incanter)。

Syntax error (FileNotFoundException) compiling at (distributions/core.clj:1:1).
Could not locate incanter/charts__init.class, incanter/charts.clj or incanter/charts.cljc on classpath.

如果我查看源代码 https://github.com/michaellindon/distributions,则没有提及 Incanter。这个咒语是从哪里来的?我如何告诉 clojure 这不是我正在寻找的依赖项。

依赖树看起来很干净:

 [clojure-complete "0.2.5" :exclusions [[org.clojure/clojure]]]
 [distributions "0.1.2"]
   [net.mikera/core.matrix "0.57.0"]
     [org.clojure/tools.macro "0.1.5"]
   [net.mikera/vectorz-clj "0.45.0"]
     [net.mikera/clojure-utils "0.7.0"]
     [net.mikera/vectorz "0.63.0"]
       [net.mikera/mathz "0.3.0"]
       [net.mikera/randomz "0.3.0"]
       [us.bpsm/edn-java "0.4.6"]
   [org.apache.commons/commons-math3 "3.6.1"]
 [nrepl "0.7.0" :exclusions [[org.clojure/clojure]]]
 [org.clojure/clojure "1.10.1"]
   [org.clojure/core.specs.alpha "0.2.44"]
   [org.clojure/spec.alpha "0.2.176"]

看不到咒语。

如果我添加咒语

 :dependencies [[org.clojure/clojure "1.10.1"]
                [distributions "0.1.2"]
                [incanter/incanter-charts "1.9.3"]]

我明白了

Syntax error (ClassNotFoundException) compiling at (bid_simulator/core.clj:2:3).
distributions.core

:clojure.main/message
 "Syntax error (ClassNotFoundException) compiling at (bid_simulator/core.clj:2:3).\ndistributions.core\n",
 :clojure.main/triage
 {:clojure.error/phase :compile-syntax-check,
  :clojure.error/line 2,
  :clojure.error/column 3,
  :clojure.error/source "core.clj",
  :clojure.error/path "bid_simulator/core.clj",
  :clojure.error/class java.lang.ClassNotFoundException,
  :clojure.error/cause "distributions.core"},
 :clojure.main/trace
 {:via
  [{:type clojure.lang.Compiler$CompilerException,
    :message "Syntax error compiling at (bid_simulator/core.clj:2:3).",
    :data
    {:clojure.error/phase :compile-syntax-check,
     :clojure.error/line 2,
     :clojure.error/column 3,
     :clojure.error/source "bid_simulator/core.clj"},
    :at [clojure.lang.Compiler analyze "Compiler.java" 6808]}
   {:type java.lang.ClassNotFoundException,
    :message "distributions.core",
    :at
    [java.net.URLClassLoader findClass "URLClassLoader.java" 435]}],
  :trace
  [[java.net.URLClassLoader findClass "URLClassLoader.java" 435]
   [clojure.lang.DynamicClassLoader
    findClass
    "DynamicClassLoader.java"
    69]
   [java.lang.ClassLoader loadClass "ClassLoader.java" 589]
   [clojure.lang.DynamicClassLoader
    loadClass
    "DynamicClassLoader.java"
    77]
   [java.lang.ClassLoader loadClass "ClassLoader.java" 522]
   [java.lang.Class forName0 "Class.java" -2]
   [java.lang.Class forName "Class.java" 427]
   [clojure.lang.RT classForName "RT.java" 2211]
   [clojure.lang.RT classForName "RT.java" 2220]
   [clojure.lang.Compiler resolveIn "Compiler.java" 7395]
   [clojure.lang.Compiler resolve "Compiler.java" 7358]
   [clojure.lang.Compiler analyzeSymbol "Compiler.java" 7319]
   [clojure.lang.Compiler analyze "Compiler.java" 6768]
   [clojure.lang.Compiler analyze "Compiler.java" 6745]
   [clojure.lang.Compiler$VectorExpr parse "Compiler.java" 3260]
   [clojure.lang.Compiler analyze "Compiler.java" 6791]
   [clojure.lang.Compiler analyze "Compiler.java" 6745]
   [clojure.lang.Compiler$InvokeExpr parse "Compiler.java" 3881]
   [clojure.lang.Compiler analyzeSeq "Compiler.java" 7109]
   [clojure.lang.Compiler analyze "Compiler.java" 6789]
   [clojure.lang.Compiler analyze "Compiler.java" 6745]
   [clojure.lang.Compiler$BodyExpr$Parser parse "Compiler.java" 6120]
   [clojure.lang.Compiler$FnMethod parse "Compiler.java" 5467]
   [clojure.lang.Compiler$FnExpr parse "Compiler.java" 4029]
   [clojure.lang.Compiler analyzeSeq "Compiler.java" 7105]
   [clojure.lang.Compiler analyze "Compiler.java" 6789]
   [clojure.lang.Compiler eval "Compiler.java" 7174]
   [clojure.lang.Compiler load "Compiler.java" 7636]
   [clojure.lang.RT loadResourceScript "RT.java" 381]
   [clojure.lang.RT loadResourceScript "RT.java" 372]
   [clojure.lang.RT load "RT.java" 459]
   [clojure.lang.RT load "RT.java" 424]
   [clojure.core$load$fn__6839 invoke "core.clj" 6126]
   [clojure.core$load invokeStatic "core.clj" 6125]
   [clojure.core$load doInvoke "core.clj" 6109]
   [clojure.lang.RestFn invoke "RestFn.java" 408]
   [clojure.core$load_one invokeStatic "core.clj" 5908]
   [clojure.core$load_one invoke "core.clj" 5903]
   [clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
   [clojure.core$load_lib invokeStatic "core.clj" 5947]
   [clojure.core$load_lib doInvoke "core.clj" 5928]
   [clojure.lang.RestFn applyTo "RestFn.java" 142]
   [clojure.core$apply invokeStatic "core.clj" 667]
   [clojure.core$load_libs invokeStatic "core.clj" 5985]
   [clojure.core$load_libs doInvoke "core.clj" 5969]
   [clojure.lang.RestFn applyTo "RestFn.java" 137]
   [clojure.core$apply invokeStatic "core.clj" 667]
   [clojure.core$require invokeStatic "core.clj" 6007]
   [clojure.core$require doInvoke "core.clj" 6007]
   [clojure.lang.RestFn invoke "RestFn.java" 408]
   [user$eval140$fn__144 invoke "form-init1507618823433517384.clj" 1]
   [user$eval140 invokeStatic "form-init1507618823433517384.clj" 1]
   [user$eval140 invoke "form-init1507618823433517384.clj" 1]
   [clojure.lang.Compiler eval "Compiler.java" 7177]
   [clojure.lang.Compiler eval "Compiler.java" 7167]
   [clojure.lang.Compiler load "Compiler.java" 7636]
   [clojure.lang.Compiler loadFile "Compiler.java" 7574]
   [clojure.main$load_script invokeStatic "main.clj" 475]
   [clojure.main$init_opt invokeStatic "main.clj" 477]
   [clojure.main$init_opt invoke "main.clj" 477]
   [clojure.main$initialize invokeStatic "main.clj" 508]
   [clojure.main$null_opt invokeStatic "main.clj" 542]
   [clojure.main$null_opt invoke "main.clj" 539]
   [clojure.main$main invokeStatic "main.clj" 664]
   [clojure.main$main doInvoke "main.clj" 616]
   [clojure.lang.RestFn applyTo "RestFn.java" 137]
   [clojure.lang.Var applyTo "Var.java" 705]
   [clojure.main main "main.java" 40]],
  :cause "distributions.core",
  :phase :compile-syntax-check}}

更新:通过在干净的新项目中添加 Incanter 清除了错误。

需求 大约在 0.1.2-SNAPSHOT 时间:https://github.com/michaellindon/distributions/blob/b6f18679be45617ff91ab362d1991061b3b84277/src/distributions/core.clj#L5

但当时的项目没有为 incanter 设置传递依赖。

确保最简单的方法是打开罐子(您可以通过 lein cp 找到它)并查看。

此时您可能只想将 incater 作为依赖项添加到您的项目中。