2013-04-05 5 views
5

Ich bin zusammen mit this example auf die Erstellung eines einfachen Web-Service in Clojure mit Ring und Steg.Wie man Jetty Beispiel mit Ring in Clojure

Ich habe dies in meinem 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"]]) 

Dieses in script/run.clj

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

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

Und das in 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)) 

Wenn ich jedoch folgendes ausführe:

lein run script/run.clj 

ich diesen Fehler:

No :main namespace specified in project.clj. 

Warum bin ich das immer und wie kann ich es beheben?

+0

Das Tutorial, zu dem Sie verlinkt haben, verwendet Leiningen 1.x - Sie sollten wahrscheinlich lein2 verwenden. – Alex

+0

Es wäre toll, wenn ich ein Tutorial finden könnte, das gerade funktioniert, seit ich lerne. Irgendwelche Vorschläge? Ich möchte einen Web-Service in Clojure –

Antwort

2

Sie haben zu setzen, dass (run-jetty) Sachen in eine -main irgendwo, und fügen Sie dann zu der project.clj wie

:main ws-example.core) 
+0

erstellen, danke, haben Sie einen Vorschlag über das Irgendwo? Das run-jetty-Zeug befindet sich in einem Skript namens run.clj. –

0

Von lein help run:

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

Also, würden Sie benötigen, um Ihre script.clj irgendwo platzieren auf dem Projektquellpfad und rufen Sie dann wie folgt auf:

lein run -m script 
+0

Dies ist mit lein2. Befehle zum "Lein run" sind in 1.x etwas anders. – Alex

3

Sie erhalten diesen Fehler, weil der Zweck von lein run (nach lein help run) ist "Führen Sie die Hauptfunktion des Projekts." Sie haben keine -main Funktion in Ihrem ws-example.web Namensraum, noch haben Sie eine :main in Ihrer project.clj Datei, die lein run beschwert ist.

Um dies zu beheben, haben Sie ein paar Optionen. Sie könnten den Code in eine neue -main-Funktion der ws-example.web-Funktion verschieben und dann lein run -m ws-example.web sagen. Oder Sie könnten das tun und auch eine Zeile :main ws-example.web zu project.clj hinzufügen und dann einfach lein run sagen. Oder Sie könnten versuchen, die Datei lein exec plugin anstelle eines Namensbereichs auszuführen.

Weitere Informationen finden Sie in der Leiningen Tutorial.

Verwandte Themen