评论者:jeroen
我已经尽量让示例尽可能简单。您说得对,ClassCastException是非常准确的,但您只有在弄清楚它与*compile-path*有关之后才会意识到这一点。这个错误报告主要关于管理(Clojure用户的)期望。
clj -A:new app example.error
cd example.error
clj
;; clj已经将*compile-path*正确设置为字符串(尽管不在类路径中)
*compile-path* ;=> "classes"
(let [f (clojure.java.io/file "classes/foo.clj")]
(clojure.java.io/make-parents f)
(spit f "(ns foo) (gen-class :name my.new.Class)")
(compile 'foo)
(clojure.java.shell/sh "ls" "classes"))
; 成功,尽管您仍然无法加载该类
; #=> {:exit 0, :out "clojure\nfoo$fn__134.class\nfoo$fn__166.class\nfoo$fn__174.class\nfoo$loading__6549__auto____132.class\nfoo$loading__6549__auto____164.class\nfoo$loading__6549__auto____172.class\nfoo.clj\nfoo__init.class\n", :err ""}
;; 从一个boot项目
;; boot.user=> *compile-path*
;; #object[java.io.File 0x5266b1a "/var/folders/ck/9zqvs0zx5vsf2bc7rvv1pwc40000gn/T/boot-repl8170014881711480931"]
;; 这可以在clj repl中重现
(binding [*compile-path* (clojure.java.io/file "classes")]
(compile 'foo)
)
编译fn*时发生语法错误(在foo.clj:1:1)。
原因:无法将java.io.File转换为java.lang.String