No main namepsace error while running a web app in Clojure using Noir

clojure, noir

Solution

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.

Problem

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 ```

Original source