2013-04-05 19 views
5

Tôi đang theo dõi cùng với this example để tạo một dịch vụ web đơn giản trong Clojure bằng cách sử dụng chuông và cầu nối.Làm thế nào để chạy Ví dụ Jetty với Ring ở Clojure

Tôi có điều này trong project.clj tôi:

(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"]]) 

này trong kịch bản/run.clj

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

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

Và điều này trong 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)) 

Tuy nhiên, khi tôi thực hiện:

lein run script/run.clj 

tôi nhận được lỗi này:

No :main namespace specified in project.clj. 

Tại sao tôi nhận này và làm thế nào để sửa chữa nó?

+0

Hướng dẫn bạn liên kết với sử dụng Leiningen 1.x - bạn có lẽ nên sử dụng lein2. – Alex

+0

Thật tuyệt vời nếu tôi có thể tìm thấy một hướng dẫn mà chỉ làm việc kể từ khi tôi đang học. Bất kỳ đề xuất? Tôi muốn tạo một dịch vụ web ở Clojure –

Trả lời

2

Bạn phải đặt rằng (run-jetty) thứ vào một -main đâu đó và sau đó thêm nó vào project.clj như

:main ws-example.core) 
+0

cảm ơn, bạn có gợi ý gì về một số nơi không? công cụ run-jetty được đặt trong một tập lệnh gọi là run.clj. –

0

Từ lein help run:

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

Vì vậy, bạn sẽ cần phải đặt script.clj bạn ở một nơi trên đường dẫn nguồn dự án và sau đó gọi nó là:

lein run -m script 
+0

Điều này đang sử dụng lein2. Các lệnh để 'lein run' hơi khác trong 1.x. – Alex

3

Bạn nhận được lỗi này vì mục đích của lein run (theo lein help run) là "Chạy chức năng -main của dự án". Bạn không có chức năng -main trong không gian tên ws-example.web của mình, cũng như bạn không có một :main được chỉ định trong tệp project.clj của bạn, đó là những gì lein run đang khiếu nại.

Để khắc phục điều này, bạn có một vài tùy chọn. Bạn có thể di chuyển mã run-jetty sang hàm -main mới của hàm ws-example.web và sau đó nói lein run -m ws-example.web. Hoặc bạn có thể làm điều đó và cũng có thể thêm một dòng :main ws-example.web vào project.clj và sau đó chỉ cần nói lein run. Hoặc bạn có thể thử sử dụng lein exec plugin để thực thi một tệp chứ không phải không gian tên.

Để biết thêm thông tin, hãy xem Leiningen Tutorial.

Các vấn đề liên quan