Clojure中src目录可使用require,core目录为何不行?
解决Clojure项目中core目录无法加载命名空间的问题
问题重现
项目结构:
fourth(项目文件夹) └── core ├── core.clj └── mycore.clj
core.clj代码:
(ns core.core) (require '[core.mycore :refer [myhello2]] :verbose) (println "hi")
mycore.clj代码:
(ns core.mycore) (defn myhello2 [] (println "hi") )
执行时出现错误:Could not locate mycore__init.class, mycore.clj or mycore.cljc on classpath,将core目录改为src则可正常运行,希望保留core目录并解决该问题。
解决方案
你之前在deps.edn中使用了错误的配置键,正确的配置应该是将core目录加入类路径,具体步骤如下:
- 修改项目根目录(fourth)下的deps.edn文件,内容改为:
{:paths ["core"]}
:paths是Clojure deps工具用来指定源文件目录的配置项,你之前用的:depths是无效配置键,因此没有效果。
- 在fourth目录下,使用以下命令运行程序:
clj -m core.core
直接运行单个.clj文件时,Clojure不会自动将core目录加入类路径;通过clj -m命令配合deps.edn的配置,就能正确加载core.mycore命名空间。
原理说明
Clojure的命名空间与文件路径一一对应:core.mycore命名空间对应core/mycore.clj文件。只有当包含该文件的父目录(即core目录)被加入类路径时,Clojure才能找到并加载这个文件。默认情况下,clj命令会自动将src目录加入类路径,所以改成src目录能正常运行;通过deps.edn的:paths配置,我们可以手动添加其他源目录到类路径中。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

