2012-12-25 10 views
11

Tôi đang sử dụng Noir.Không có lỗi tên lỗi chính nào khi chạy ứng dụng web ở Clojure bằng Noir

Đây là project.clj tôi

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

Lein chạy mang lại cho tôi lỗi này:

No :main namespace specified in project.clj. 

tôi đi đâu vậy?

Bây giờ, nếu tôi thêm: chính my-website.server để project.clj, tôi nhận được lỗi này:

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: may- 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

Dường như bạn không có chức năng -main trong my-website.server. Bạn đã tạo dự án như thế nào? Nếu bạn làm lein noir mới của tôi-trang web nó thiết lập project.clj và tạo ra một chức năng mặc định -main trong server.clj –

+1

Đó là những gì tôi đã làm. lein noir new appname – Hick

Trả lời

9

vấn đề là Lein không biết nơi nào để xác định vị trí -main chức năng của bạn:

Trước tiên, bạn phải tạo .clj tập tin để chạy. Bạn có thể chỉ định không gian tên của nó bằng cách sử dụng macro ns. Sau đó, bạn sẽ xác định -main chức năng trong namespace này:

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

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

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

Sau đó, bạn phải cấu hình project.clj của bạn:

(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à phiên bản ổn định mới nhất của noir. Tốt nhất là sử dụng cái này.

Đừng quên đặt tệp này vào thư mục nguồn của bạn. Bu mặc định thư mục ./src trong thư mục gốc của dự án của bạn. Vì vậy, nếu không gian tên của bạn được gọi là my-website.server thì lein sẽ tìm kiếm nó trong ./src/my-website/server.clj tệp (hoặc trong ./src/my_website/server.clj, tôi không chắc chắn).

Bây giờ lein run sẽ khiến bạn nhập không gian tên my-website.server và sau đó chạy chức năng (-main).

Xem sample lein project để biết thêm thông tin.

Bạn cũng có thể tạo project.clj cho dự án noir của mình bằng cách sử dụng lein noir template.

+1

Tệp .clj này nên được gọi là gì? (Xin lỗi, chỉ cần bắt đầu và có một chút báo trước về tài liệu để làm mịn điều này.) – Hick

+0

Tôi vừa chỉnh sửa câu trả lời của mình để thêm thông tin này. –

+0

Thực hiện điều đó. Lỗi hiện tại: Ngoại lệ trong chuỗi "main" java.lang.RuntimeException: Không thể phân giải biểu tượng: defpartial trong ngữ cảnh này, biên dịch: (noir/content/defaults.clj: 8) – Hick