消除 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 作为依赖项添加到您的项目中。
我已经添加了对 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 作为依赖项添加到您的项目中。