非常感谢您尝试帮助@alexmiller。您能推荐一些地方来学习关于类加载器和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
"Syntax error compiling at (/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 加载 "RT.java" 424]
[clojure.core$load$fn__6839 调用 "core.clj" 6126]
[clojure.core$load invokeStatic "core.clj" 6125]
[clojure.core$load doInvoke "core.clj" 6109]
[clojure.lang.RestFn 调用 "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5908]
[clojure.core$load_one 调用 "core.clj" 5903]
[clojure.core$load_lib$fn__6780 调用 "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 调用 "RestFn.java" 408]
[user$eval4834 invokeStatic "add-lib-test.clj" 4]
[user$eval4834 调用 "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 调用 "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}}