2012-12-25 9 views
11

Sto utilizzando Noir.Errore di namepsace principale durante l'esecuzione di un'app Web in Clojure con Noir

Questo è il mio project.clj

(defproject noir "1.0.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :dependencies [[org.clojure/clojure "1.3.0"]]) 

Lein corsa mi dà questo errore:

No :main namespace specified in project.clj. 

Dove sto andando male?

Ora, se aggiungo: main my-website.server a project.clj, ottengo questo errore:

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: mio- website.server

at clojure.lang.Util.runtimeException(Util.java:165) 
    at clojure.lang.RT.classForName(RT.java:2017) 
    at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:206) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:92) 
    at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:225) 
    at user$eval29.invoke(NO_SOURCE_FILE:1) 
    at clojure.lang.Compiler.eval(Compiler.java:6465) 
    at clojure.lang.Compiler.eval(Compiler.java:6455) 
    at clojure.lang.Compiler.eval(Compiler.java:6431) 
    at clojure.core$eval.invoke(core.clj:2795) 
    at clojure.main$eval_opt.invoke(main.clj:296) 
    at clojure.main$initialize.invoke(main.clj:315) 
    at clojure.main$null_opt.invoke(main.clj:348) 
    at clojure.main$main.doInvoke(main.clj:426) 
    at clojure.lang.RestFn.invoke(RestFn.java:421) 
    at clojure.lang.Var.invoke(Var.java:405) 
    at clojure.lang.AFn.applyToHelper(AFn.java:163) 
    at clojure.lang.Var.applyTo(Var.java:518) 
    at clojure.main.main(main.java:37) 
Caused by: java.lang.ClassNotFoundException: my-website.server 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:61) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:264) 
    at clojure.lang.RT.classForName(RT.java:2013) 
    ... 21 more 
+0

Sembra che tu non abbia una funzione -main in my-website.server. Come hai creato il progetto? Se fai lein noir new my-website, imposta project.clj e crea una funzione default-main in server.clj –

+1

Ecco cosa ho fatto. lein noir new appname – Hick

risposta

9

Il problema è che Lein non so dove trovare il vostro -main funzione:

In primo luogo, si deve creare .clj file da eseguire. Puoi specificare il suo spazio dei nomi usando la macro ns. Poi si definiscono -main funzione in questo spazio dei nomi:

(ns my-website.server 
    (:require [noir.server :as server] 
      [noir.core :refer [defpage]])) 

(defpage "/welcome" [] 
    "Welcome to Noir!") 

(defn -main 
    [& args] 
    (server/start 4000)) 

Poi si deve configurare il project.clj:

(defproject my-website "0.1.0-SNAPSHOT" 
      :description "..." 
      :dependencies [[org.clojure/clojure "1.4.0"] 
          [noir "1.2.2"]] 
      :main my-website.server) 

[noir "1.2.2"] è l'ultima versione stabile del noir. È meglio usare questo.

Non dimenticare di inserire questo file nella directory di origine. Bu default la sua dir ./src nella root del progetto. Quindi, se il tuo spazio dei nomi è chiamato my-website.server allora lein lo cercherà nel file ./src/my-website/server.clj (o in ./src/my_website/server.clj, non sono sicuro).

Ora lein run causerà Lein entrare namespace my-website.server e poi a correre (-main) funzione.

Vedere sample lein project per ulteriori informazioni.

È inoltre possibile generare project.clj per il progetto noir utilizzando lein noir template.

+1

Questo file .clj dovrebbe essere chiamato cosa? (Ci scusiamo, è appena iniziata e c'è un po 'di avvertenza per chiarire questo aspetto.) – Hick

+0

Ho appena modificato la mia risposta per aggiungere questa informazione. –

+0

Fatto. Errore corrente: eccezione nel thread "main" java.lang.RuntimeException: impossibile risolvere il simbolo: defpartial in questo contesto, compilando: (noir/content/defaults.clj: 8) – Hick

Problemi correlati