Despliege de una aplicación en Clojure a través de run-jetty y lein

Estos dias estoy empezando con clojure gracias a las malas influencias, y en el despliege de mi primera aplicación a traves de run-jetty me ha pasado lo siguiente:

1) Crear el projecto tut1 y descargar las dependencias

lein new tut1

lein deps

2) Arrancar un CLI

lein repl

y con lo siguiente, se inicia el server:

(use ‘ring.adapter.jetty)

(use ‘tut1.core)

(run-jetty handler {:port 4333})

Hasta ahí todo perfecto, pero quiero usar lein run para ejecutar sin entrar en el CLI. El ejemplo oficial siempre me daba class.notfound para run-jetty, core.clj era lo siguiente:

(ns tut1.core)

(defn handler [request]
{:status 200
:headers {“Content-Type” “text/html”}
:body “Hello World”})

(defn -main
[]

(use ‘ring.adapter.jetty)

(run-jetty handler {:port 4343})
)

Bueno,  no iba de ninguna manera, el class.clj poniendole el :main o quitándoselo y dejando :ring … nada, siempre class.notfound exception.

Mi solución  consistió en poner en el project.clj lo siguiente:

(defproject tut1 “1.0.0-SNAPSHOT”
:description “FIXME: write description”
:dependencies [[org.clojure/clojure "1.3.0"]
[ring/ring-core "1.2.0"]
[ring/ring-jetty-adapter "1.2.0"]
]
:plugins [[lein-ring "0.8.6"]]
:ring {:handler tut1.core/handler}
:main tut1.core
)

Y aquí ojo porque  están a la vez :ring del plugin lein-ring y :main, y en todos los ejemplos que había visto para lein-ring  se omitía el :main  y claro, no tiraba, y la llamada a handler a través de lein-ring solo devolvía extrañamente lo que se suponia que tenia que devolver, un pequeño texto … o sea que al final resulta que lo mas fácil fue prescindible lein-ring y haciendo el arranque en jetty en el /src/tut1/core.clj de la forma siguiente:

(ns tut1.core)

(use ‘ring.adapter.jetty)
(defn handler [request]
{:status 200
:headers {“Content-Type” “text/html”}
:body “Hello World”})

(defn -main
[]

(run-jetty handler {:port 4343})
)

Simplemente he sacado el use ring.adapter.jetty al inicio y ahora con lein run se ejecuta un servidor web con la app en clojure ejecutándose en el puerto adecuado a través de putty. Acordarse también de eliminar el plugin lein-ring que se muestra en estos src, ya que no se usa si haces los despliegues de esta manera.

El efecto final es:

manu@debdev:/srv/tut1$ lein run
2013-08-08 00:47:53.333:INFO:oejs.Server:jetty-7.6.8.v20121106
2013-08-08 00:47:53.364:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:4343

A divertirse :)

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>