如果您尝试像以下那样编译附件文件(假设它们位于 "src" 文件夹中)
java -Dclojure.compile.path=out -cp "./clojure-1.8.0.jar:out:src" clojure.lang.Compile implementer 协议 consumer
将抛出异常
`
线程 "main" 中出现异常 java.lang.ClassCastException:implementer.Obj 无法转换为 protocol.Dependent,编译:(consumer.clj:5:1)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3657)
at clojure.lang.Compiler.compile1(Compiler.java:7474)
at clojure.lang.Compiler.compile(Compiler.java:7541)
at clojure.lang.RT.compile(RT.java:406)
at clojure.lang.RT.load(RT.java:451)
at clojure.lang.RT.load(RT.java:419)
at clojure.core$load$fn__5677.invoke(core.clj:5893)
at clojure.core$load.invokeStatic(core.clj:5892)
at clojure.core$load.doInvoke(core.clj:5876)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5697)
at clojure.core$compile$fn__5682.invoke(core.clj:5903)
at clojure.core$compile.invokeStatic(core.clj:5903)
at clojure.core$compile.invoke(core.clj:5895)
at clojure.lang.Var.invoke(Var.java:379)
at clojure.lang.Compile.main(Compile.java:67)
原因:java.lang.ClassCastException:implementer.Obj 无法转换为 protocol.Dependent
at protocol$fn__12$G__8__14.invoke(protocol.clj:3)
at protocol$fn__12$G__7__17.invoke(protocol.clj:3)
at protocol$expand_deps.invokeStatic(protocol.clj:8)
at protocol$expand_deps.invoke(protocol.clj:6)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3652)
... 15 more
`
- 1.6 或更早版本不会有这个问题
- 如果不尝试 AOT,则不会出现此问题
- 对于某些参数排序,可能不会发生此问题
这看起来与两个不同的类加载器加载的类有关,也可能导致名称空间编译多次。这个问题在您的生产构建中多次出现,但花了很长时间才意识到这是一个编译器问题,并找到了一个最小示例。