I'm trying to write my first web app in compojure. I'm using ccw, and I File-New-Project, Clojure Project
and use the "compojure" leiningen template. End up with project.clj looking like
(defproject asdf "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:dependencies [[org.clojure/clojure "1.4.0"]
[compojure "1.1.5"]]
:plugins [[lein-ring "0.8.2"]]
:ring {:handler asdf.handler/app}
:profiles
{:dev {:dependencies [[ring-mock "0.1.3"]]}})
src/asdf/handler.clj looks like
(ns asdf.handler
(:use compojure.core)
(:require [compojure.handler :as handler]
[compojure.route :as route]))
(defroutes app-routes
(GET "/" [] "Hello World")
(route/not-found "Not Found"))
(def app
(handler/site app-routes))
I found I can run this using lein ring server
from the command line, but I'm not sure how to run this from eclipse. I'm of course hoping to be able not only to run it, but also to debug it and set breakpoints and such. Is there a way to do this in eclipse? Or, if not, how about IntelliJ/La-Clojure? (I'm a bit afraid of emacs, for now, but maybe if it's super-simple I'd give it a try).
Or, is this just not the typical development process for a compojure app? (If not, what is? Just run lein ring server
and pray?)
If it makes a difference this is on Win7.
Here's a recipe that's work great for me while developing Ring applications:
Leiningen > Reset configuration
Leiningen > Update dependencies
commandLeiningen Dependencies
virtual node in your project, referencing the direct and transitive dependencies of your projectasdf.handler
file, right click and then Debug as > Clojure Application
asdf.handler
namespace in an editorCtrl+Alt+N
to jump to the REPL and switch the REPL's current namespace to asdf.handler
at the same time(app)
+ Enter
(or Ctrl+Enter
if your cursor is not at the end of the line)You can now navigate between the editors and the REPL.
Ctrl+Enter
Ctrl+Enter
without a selection, the whole 'top level expression' (e.g. a defn) will be sent to the REPLCtrl+Alt+S
Note that a future version of Counterclockwise will integrate a little bit more with Leiningen 2, but as it currently stands, the very nature of developing ring
applications make it not so painful to bootstrap things as described above, IMHO
You can run Compojure/Ring apps on IntelliJ IDEA and La Clojure with the following steps:
pom.xml
from leiningen's project.clj
using lein pom
command.After that, to start a Ring app you can just load a Clojure file that invokes ring.adapter.jetty/run-jetty
.
The code to run a simple route on http://localhost:4004/
would look like this:
(require 'compojure.core)
(require 'ring.adapter.jetty)
(ring.adapter.jetty/run-jetty
(compojure.core/routes (compojure.core/ANY "/" [] "Hello world!"))
{:port 4004 :join? false})
:join?
option is important, if it would be set to true (the default), the REPL would not accept more commands. Your routes will usually be more complex and compojure.core/defroutes
or other means should be used.
You can put such file in test
path, so it wouldn't be loaded when running the project outside of IDEA.
If Clojure facet is not added to your module, you can add it in File -> Project Structure -> Modules.
A complete sample (with jetty reloading) is available here: https://github.com/tlipski/ganelon-demo - development is done with IDEA and real site runs on Heroku: http://ganelon.herokuapp.com.
Debugging Clojure apps run with the technique above is possible as well - you just have to:
agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
) to REPL settings in File -> Project Structure -> Modules -> [your module] -> Clojure facet -> JVM Arguments field.After that, you can add breakpoints, inspect variables, etc.
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