如何在Clojure中使用Ring运行Jetty示例

时间:2013-04-05 16:26:35

标签: clojure jetty leiningen ring

我正在跟随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.

为什么我得到这个以及如何修复它?

3 个答案:

答案 0 :(得分:3)

您收到此错误是因为lein run(根据lein help run)的目的是“运行项目的-main函数”。您的-main命名空间中没有ws-example.web功能,:main文件中也没有指定project.cljlein runrun-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