与Leiningen和Ring的FileNotFoundException

时间:2017-01-29 08:25:33

标签: clojure leiningen ring

我正在使用Leiningen和Ring通过命令行对我正在制作的项目reagent_test进行调试,我遇到了一个问题:

C:/...reagent_test>lein ring server
... huge chunk of errors
Caused by: java.io.FileNotFoundException: Could not locate reagent_test/core__init.class or reagent_test/core.clj on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.
... more errors

如果有人想要解决这个问题,我会在需要时制作一个。

问题是,文件都在正确的位置。这是我的project.clj

(defproject reagent-test "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :plugins [[lein-cljsbuild "1.1.5"]
            [lein-ring "0.10.0"]]
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/clojurescript "1.9.456"]
                 [ring "1.4.0"]
                 [leiningen "2.7.1"]
                 [reagent "0.6.0"]
                 [garden "1.3.2"]]
  :cljsbuild {:builds {:app {:source-paths ["src/cljs"]}
                            :compiler {:output-to "resources/public/main.js"
                                        :pretty-print true}}}
  :ring {:handler reagent-test.core/-main})

我的项目结构是这样的(至少对于相关文件):

src:
  clj:
    reagent_test:
      core.clj
  cljs:
    reagent_test:
      core.cljs
project.clj

core.cljcore.cljs中,我将此作为我的命名空间:

(ns reagent-test.core)

注意:文件夹有冒号而文件没有。

2 个答案:

答案 0 :(得分:0)

在文件顶部的名称空间声明中,您应该使用短划线:

(ns reagent-test.core)

而文件(以及文件上方的所有目录)应使用下划线。因此,文件名应为whatever/reagent_test/core.cljwhatever/reagent_test/core.cljs

答案 1 :(得分:0)

正如克里斯墨菲在他的回答评论中所指出的那样。由于您稍微更改了项目目录结构,因此需要修改project.clj文件:

(defproject reagent-test "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :plugins [[lein-cljsbuild "1.1.5"]
            [lein-ring "0.10.0"]]
  :source-paths ["src/clj"]
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/clojurescript "1.9.456"]
                 [ring "1.4.0"]
                 [leiningen "2.7.1"]
                 [reagent "0.6.0"]
                 [garden "1.3.2"]]
  :cljsbuild {:builds {:app {:source-paths ["src/cljs"]}
                            :compiler {:output-to "resources/public/main.js"
                                        :pretty-print true}}}
  :ring {:handler reagent-test.core/-main})

添加是:source-paths键,它应指定Clojure代码的目录。默认情况下,lein使用src目录作为Clojure源文件的根目录。