评论区:jeroen
我已经尽可能地使示例简单。您是对的,ClassCastException非常准确,但您只有弄清楚这是关于*compile-path*之后才会意识到这一点。这个错误报告主要关于管理(Clojure用户)的期望。
clj -A:new app example.error
cd example.error
clj
;; clj已将*compile-path*更改为字符串值(尽管不在classpath中)
*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