I'm using Noir.
This is my project.clj
(defproject noir "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.3.0"]])
lein run gives me this error:
No :main namespace specified in project.clj.
Where am I going wrong?
Now, if I add :main my-website.server to project.clj, I get this error:
Exception in thread "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
                The problem is that lein don't know where to locate your -main function:
First, you shall create .clj file to run. You can specify it's namespace using ns macro. Then you shall define -main function in this namespace:
(ns my-website.server
  (:require [noir.server :as server]
            [noir.core :refer [defpage]]))
(defpage "/welcome" []
  "Welcome to Noir!")
(defn -main
  [& args]
  (server/start 4000))
Then you shall configure your 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"] is the latest stable version of noir. It's best to use this one.
Do not forget to place this file into your source directory. Bu default its ./src dir in your project root. So, if your namespace is called my-website.server then lein will look for it in ./src/my-website/server.clj file (or in ./src/my_website/server.clj, I'm not sure).
Now lein run will cause lein to enter namespace my-website.server and then to run (-main) function.
See sample lein project for more info.
You can also generate project.clj for your noir project using lein noir template.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With