评论由:jeroen 提出
我已经尽量简化了这个例子。你是对的,ClassCastException 的确非常准确,但你在明白它是关于 *compile-path* 之后才会意识到这一点。这个错误报告主要关于管理 Clojure 用户(对 compile-path 的预期)。
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)
)
Syntax error compiling fn* at (foo.clj:1:1).
原因:java.io.File 无法转换为 java.lang.String