我正在跟随this example一起使用ring和jetty在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"]])
这在脚本/ 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.
为什么我得到这个以及如何修复它?
答案 0 :(得分: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.web
。或者你可以这样做,并在project.clj
添加一行lein run
,然后只说{{1}}。或者您可以尝试使用lein exec
plugin来执行文件,而不是命名空间。
有关详细信息,请查看Leiningen Tutorial。
答案 1 :(得分:2)
您必须将(run-jetty)
内容放入-main
某处,然后将其添加到project.clj
:main ws-example.core)
答案 2 :(得分: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