2012-12-25 9 views
11

Używam Noir.Brak głównego błędu namysłu podczas uruchamiania aplikacji internetowej w Clojure przy użyciu Noir

To mój project.clj

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

Lein run daje mi ten błąd:

No :main namespace specified in project.clj. 

Gdzie jestem będzie niewłaściwy?

Teraz, jeśli dodam: main my-website.server do project.clj, otrzymuję ten błąd:

Wyjątek w wątku "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: my- 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

Wygląda na to, że nie masz funkcji -nainit w moim-website.server. Jak stworzyłeś projekt? Jeśli zrobisz lein noir na mojej nowej stronie internetowej, to ustawisz project.clj i utworzysz domyślną funkcję -nain w server.clj –

+1

Tak właśnie zrobiłem. lein noir new appname – Hick

Odpowiedz

9

problemem jest to, że Lein nie wiem gdzie zlokalizować -main funkcję:

pierwsze, będziecie tworzyć .clj plik do uruchomienia. Możesz określić jego przestrzeń nazw przy użyciu makra ns. Wtedy można zdefiniować -main funkcji w tej przestrzeni nazw:

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

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

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

tedy skonfigurować 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"] jest najnowsza stabilna wersja Noir. Najlepiej z tego skorzystać.

Nie zapomnij umieścić tego pliku w katalogu źródłowym. Bu domyślnie jest to katalog ./src w katalogu głównym projektu. Tak więc, jeśli twoja przestrzeń nazw nazywa się my-website.server, wtedy lein będzie szukał jej w pliku ./src/my-website/server.clj (lub w ./src/my_website/server.clj, nie jestem pewien).

Teraz lein run spowoduje, że lein wejdzie w przestrzeń nazw my-website.server, a następnie uruchomi funkcję (-main).

Aby uzyskać więcej informacji, patrz sample lein project.

Można również wygenerować project.clj dla projektu noir przy użyciu lein noir template.

+1

Ten plik .clj powinien zostać wywołany co? (Przepraszam, dopiero się uruchamiam i jest trochę zastrzeżenia do tego, żeby to wygładzić.) – Hick

+0

Właśnie edytowałem swoją odpowiedź, aby dodać te informacje. –

+0

Zrobiłem to. Bieżący błąd: wyjątek w wątku "główny" java.lang.RuntimeException: nie można rozwiązać symbolu: defpartial w tym kontekście, kompilacja: (noir/content/defaults.clj: 8) – Hick

Powiązane problemy