非常感谢您帮助 @alexmiller。您能推荐一个学习ClassLoaders和JVM背景的地方吗?我有点尴尬,因为我自己不能诊断这个问题。
我已经修改了`add-test-lib.clj`以与最新版本的`add-lib`(现在是`add-libs`)一起使用,并按照您提供的示例设置了`DynamicClassLoader`。
(->>(Thread/currentThread)
(.getContextClassLoader)
(clojure.lang.DynamicClassLoader.)
(.setContextClassLoader (Thread/currentThread)))
(use 'clojure.tools.deps.alpha.repl)
(add-libs {'thi.ng/geom {:mvn/version "1.0.0-RC4"}})
(require `thi.ng.geom.svg.core)
(thi.ng.geom.svg.core/circle [0 1] 6)
现在我开始运行最新版本
clj -Sdeps '{:deps {org.clojure/tools.deps.alpha {:git/url "
https://github.com/clojure/tools.deps.alpha.git :sha "241cd24c35ba770aea4773ea161d45276e5d3a73"}}}' add-lib-test.clj
再次,它在REPL中正常工作,但通过文件则不行。然而,它现在前进了一点点 :) 我猜ClassLoader仍然有问题,或者是非REPL的类路径(我对这个术语也有一些模糊)出了一些问题。
{:clojure.main/message
"语法错误(FileNotFoundException)在(add-lib-test.clj:4:1)编译时找不到。\n无法在类路径上找到thi/ng/geom/svg/core__init.class,thi/ng/geom/svg/core.clj或thi/ng/geom/svg/core.cljc,\n",
:clojure.main/triage
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 4,
:clojure.error/column 1,
:clojure.error/source "add-lib-test.clj",
:clojure.error/path "add-lib-test.clj",
:clojure.error/class java.io.FileNotFoundException,
:clojure.error/cause
"Could not locate thi/ng/geom/svg/core__init.class, thi/ng/geom/svg/core.clj or thi/ng/geom/svg/core.cljc on classpath."},
:clojure.main/trace
{:via
[{:type clojure.lang.Compiler$CompilerException,
:message
"语法错误在/home/geokon/add-lib-test.clj:4:1编译时。",
:data
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 4,
:clojure.error/column 1,
:clojure.error/source "/home/geokon/add-lib-test.clj"},
:at [clojure.lang.Compiler load "Compiler.java" 7648]}
{:type java.io.FileNotFoundException,
:message
"Could not locate thi/ng/geom/svg/core__init.class, thi/ng/geom/svg/core.clj or thi/ng/geom/svg/core.cljc on classpath.",
:at [clojure.lang.RT load "RT.java" 462]}],
:trace
[[clojure.lang.RT load "RT.java" 462)
[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$eval4834 invokeStatic "add-lib-test.clj" 4]
[user$eval4834 invoke "add-lib-test.clj" 4]
[clojure.lang.Compiler eval "Compiler.java" 7177]
[clojure.lang.Compiler load "Compiler.java" 7636]
[clojure.lang.Compiler loadFile "Compiler.java" 7574]
[clojure.main$load_script invokeStatic "main.clj" 475]
[clojure.main$script_opt invokeStatic "main.clj" 535]
[clojure.main$script_opt invoke "main.clj" 530]
[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
"无法在类路径中找到 thi/ng/geom/svg/core__init.class, thi/ng/geom/svg/core.clj 或 thi/ng/geom/svg/core.cljc。",
:phase :compile-syntax-check}}