Clojure 从其他命名空间导入记录时发生ClassNotFoundException

Clojure 从其他命名空间导入记录时发生ClassNotFoundException,clojure,namespaces,leiningen,Clojure,Namespaces,Leiningen,我有以下文件: src/my_proj/myns.clj: (ns my-proj.myns) (defrecord MyRecord [a b c]) (ns my-proj.myns-test (:require [clojure.test :refer :all] [my-proj.myns :refer :all]) (:import [my-proj.myns MyRecord])) (def my-rec (MyRecord. "A" "B" "C"))

我有以下文件:

src/my_proj/myns.clj

(ns my-proj.myns)
(defrecord MyRecord  [a b c])
(ns my-proj.myns-test
  (:require [clojure.test :refer :all]
        [my-proj.myns :refer :all])
  (:import [my-proj.myns MyRecord]))

(def my-rec (MyRecord. "A" "B" "C"))

(deftest my-test
  (testing "test"
    (is (:a my-rec))))
测试/my_proj/myns_测试.clj

(ns my-proj.myns)
(defrecord MyRecord  [a b c])
(ns my-proj.myns-test
  (:require [clojure.test :refer :all]
        [my-proj.myns :refer :all])
  (:import [my-proj.myns MyRecord]))

(def my-rec (MyRecord. "A" "B" "C"))

(deftest my-test
  (testing "test"
    (is (:a my-rec))))
当我跑步时:

lein test
我得到一个ClassNotFoundException:

Exception in thread "main" java.lang.ClassNotFoundException: my-proj.myns.MyRecord
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:61)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at java.lang.Class.forName0(Native Method)

我缺少什么?

如果要导入,则需要将连字符更改为下划线

user=> (ns sad-hyphen)
nil
sad-hyphen=> (defrecord MyRecord [a b c])
sad_hyphen.MyRecord
sad-hyphen=> (ns foo)
nil
foo=> (import '(sad-hyphen MyRecord))
ClassNotFoundException sad-hyphen.MyRecord ... 
foo=> (import '(sad_hyphen MyRecord))
sad_hyphen.MyRecord

但是,通常不需要导入记录,只需使用
->MyRecord
map->MyRecord
构造函数(通过require/reference引入您的命名空间)。

我感觉这是重复的,但我在查找几分钟后找不到引用。啊,好了,给你…谢谢,这让我更感动了。但我还是对莱恩有意见。在REPL中,它正按照您所描述的那样工作。但是当运行lein测试时,我仍然得到ClassNotFoundException。当使用map->MyRecordMyRecord(在REPL中工作正常)时,在运行lein test时,我得到了“无法解析符号:map->MyRecordMyRecord,在此上下文中编译:(my_proj/myns_test.clj:6:13)”。@ViktorK。对于接受map参数的构造函数来说,它只是
map->MyRecord
而不是
map->MyRecordMyRecord
。谢谢,我昨天键入该参数时可能太累了:)