2013-04-05 14 views
5

Sto seguendo insieme a this example sulla creazione di un semplice servizio Web in Clojure utilizzando ring e jetty.Come eseguire l'esempio di molo con squillo in Clojure

ho questo nel mio 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"]]) 

questo nello script/run.clj

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

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

E questo 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)) 

Tuttavia, quando eseguo:

lein run script/run.clj 

ottengo questo errore:

No :main namespace specified in project.clj. 

Perche 'si ottengono questo e come posso risolvere il problema?

+0

L'esercitazione che hai collegato a Leiningen 1.x - probabilmente dovresti usare lein2. – Alex

+0

Sarebbe bello se potessi trovare un tutorial che ha funzionato da quando sto imparando. Eventuali suggerimenti? Voglio creare un servizio web in Clojure –

risposta

2

devi mettere che (run-jetty) roba in un -main da qualche parte e poi aggiungerlo al project.clj come

:main ws-example.core) 
+0

grazie, hai qualche suggerimento su somehwhere? il materiale del run-jetty si trova in uno script chiamato run.clj. –

0

Da lein help run:

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

Quindi, si avrebbe bisogno di mettere il vostro script.clj da qualche parte sul percorso di origine del progetto e quindi chiamarlo come:

lein run -m script 
+0

Questo sta usando lein2. I comandi per 'lein run' sono leggermente diversi in 1.x. – Alex

3

Si sta verificando questo errore perché lo scopo di lein run (in base a lein help run) è di "Eseguire la funzione di avvio del progetto". Non hai una funzione -main nello spazio dei nomi ws-example.web, né hai uno :main specificato nel tuo file project.clj, che è ciò che si lamenta di lein run.

Per risolvere questo problema, sono disponibili alcune opzioni. È possibile spostare il codice run-jetty in una nuova funzione -main della funzione ws-example.web e quindi pronunciare lein run -m ws-example.web. Oppure puoi farlo e anche aggiungere una riga :main ws-example.web a project.clj e quindi dire semplicemente lein run. Oppure puoi provare a utilizzare lein exec plugin per eseguire un file, piuttosto che uno spazio dei nomi.

Per ulteriori informazioni, consultare lo Leiningen Tutorial.