Clojure Pedestal 使用lein repl加载命名空间报类路径找不到错误
问题核心原因
- 工具链与项目配置不匹配:使用
lein repl(Leiningen工具)启动REPL,但项目仅配置了Clojure官方CLI使用的deps.edn文件,缺少Leiningen要求的project.clj配置。Leiningen启动时不会自动识别deps.edn的路径配置,不会将src目录加入类路径,因此无论src下存在多少文件,REPL都会提示找不到对应命名空间的类文件。 - 命名空间与文件映射不合法:
src/hello.clj未按照Clojure规范声明文件对应的命名空间,仅写了函数定义,即使类路径配置正确,也无法被(require 'hello)正常加载。 - 代码存在语法与拼写错误:
test.clj中引入路由模块时包名拼写错误:写为io.pedesteal.http.route,正确包路径为io.pedestal.http.route- 字符串值使用了全角中文弯引号、
Herllo拼写错误,会触发语法解析失败
分步解决方法
- 二选一匹配对应的REPL启动方式,确保类路径正确加载
src目录:- 若继续使用Leiningen:在项目根目录创建
project.clj配置文件,写入最小可用的项目定义:
保存后重新执行(defproject test "0.1.0" :source-paths ["src"] :dependencies [[io.pedestal/pedestal.service "0.5.7"] [io.pedestal/pedestal.route "0.5.7"] [io.pedestal/pedestal.jetty "0.5.7"] [org.slf4j/slf4j-simple "1.7.28"]])lein repl即可正常加载src下的命名空间。 - 若沿用现有
deps.edn配置:不再使用lein repl,直接在项目根目录执行clj命令启动REPL,该工具会自动读取deps.edn中的:paths配置将src目录加入类路径,与官方教程的配置逻辑完全一致。
- 若继续使用Leiningen:在项目根目录创建
- 修正
hello.clj的基础定义:在文件最开头添加对应的命名空间声明,调整后文件内容为:
(同时修正全角引号、拼写错误的字符串内容)(ns hello) (defn respond-hello [request] {:status 200 :body "Hello world"}) - 修正
test.clj的拼写错误:将路由模块的引入路径改为正确的包名:(ns test (:require [io.pedestal.http :as http] [io.pedestal.http.route :as route]))
内容的提问来源于stack exchange,提问作者Jonas Fredriksson
相关产品推荐
相关产品推荐

