6

我正在跟随这个示例使用环和码头在 Clojure 中创建一个简单的 Web 服务。

我的 project.clj 中有这个:

(defproject ws-example "0.0.1"
  :description "REST datastore interface."
  :dependencies
    [[org.clojure/clojure "1.5.1"]
     [ring/ring-jetty-adapter "0.2.5"]
     [ring-json-params "0.1.0"]
     [compojure "0.4.0"]
     [clj-json "0.5.3"]]
   :dev-dependencies
     [[lein-run "1.0.0-SNAPSHOT"]])

这在 script/run.clj

(use 'ring.adapter.jetty)
(require '[ws-example.web :as web])

(run-jetty #'web/app {:port 8080})

这在 src/ws_example/web.clj

(ns ws-example.web
  (:use compojure.core)
  (:use ring.middleware.json-params)
  (:require [clj-json.core :as json]))

(defn json-response [data & [status]]
  {:status (or status 200)
   :headers {"Content-Type" "application/json"}
   :body (json/generate-string data)})

(defroutes handler
  (GET "/" []
    (json-response {"hello" "world"}))

  (PUT "/" [name]
    (json-response {"hello" name})))

(def app
  (-> handler
    wrap-json-params))

但是,当我执行时:

lein run script/run.clj

我收到此错误:

No :main namespace specified in project.clj.

为什么我会得到这个,我该如何解决?

4

3 回答 3

3

您收到此错误是因为lein run(根据lein help run)的目的是“运行项目的 -main 函数”。您的命名空间中没有-main函数,文件中ws-example.web也没有:main指定的函数project.clj,这lein run就是抱怨的原因。

要解决此问题,您有几个选择。您可以将run-jetty代码移动到该函数的新-main函数ws-example.web,然后说lein run -m ws-example.web. 或者您可以这样做并添加一行:main ws-example.webproject.clj然后说lein run. 或者您可以尝试使用lein exec插件来执行文件,而不是命名空间。

有关更多信息,请查看Leiningen 教程

于 2014-03-06T14:53:21.770 回答
2

你必须把这些(run-jetty)东西放在-main某个地方,然后把它添加到project.clj类似的地方

:main ws-example.core)
于 2013-04-05T16:34:51.000 回答
0

来自lein help run

USAGE: lein run -m NAMESPACE[/MAIN_FUNCTION] [ARGS...]
Calls the main function in the specified namespace.

因此,您需要将您的script.clj某处放在项目源路径上,然后将其称为:

lein run -m script
于 2013-04-05T17:27:22.187 回答