2012-08-22 12 views
7

Tengo el proyecto clojure con biblioteca de anillos. Esta es project.clj:Cómo compilar la aplicación clojure con el servidor de anillos

(defproject words "1.0.0-SNAPSHOT" 
:description "Websocket handler for sessions" 
:dependencies [[org.clojure/clojure "1.4.0"] 
    [org.clojure/clojure-contrib "1.2.0"] 
    [aleph "0.3.0-alpha1"] 
    [org.clojure/data.json "0.1.2"] 
    [clj-redis "0.0.13-SNAPSHOT"] 
    [compojure "0.6.2"] 
    [clj-http "0.1.3"]] 
:main words.play 
;; Lein ring plugin will provide `lein ring server` functionality 
;; (and some other relative to ring actions) 
:plugins [[lein-ring "0.6.6"]] 
:ring {:handler words.api/engine}) 

En entorno de desarrollo de la funciono con 2 comandos: servidores de funcionamiento Lein servidor anillo Lein y es obras.

Para entorno de producción quiero minimizar las dependencias y construirlo en la jarra independiente con:

lein uberjar 

¿Cómo puedo construir yo y ejecutar ambos servidores de un archivo jar?

Respuesta

5

En cuanto a

:main words.play 

consejo que usted para implementar -main función en words.play algo así como

(defn -main [& args] 
    (case (first args) 
    "server1" (do (println "Starting server1") (start-server1)) 
    "server2" (do (println "Starting server2") (start-server2)) 
    (println "Enter server name, pls"))) 

Nota, que :gen-class es necesario espacio de nombres definición:

(ns words.play 
    (:gen-class)) 

Implementación de start-server1 y start-server2 deben depender de marcos de hormigón: (run-jetty ...) para anillo, (start-http-server ...) para aleph, etc. (puede encontrar más información en la documentación relativa).

Uso:

lein uberjar 
## to start first server 
java -jar my-project-1.0.0-SNAPSHOT-standalone.jar server1 
## to start second one 
java -jar my-project-1.0.0-SNAPSHOT-standalone.jar server2 
4

El enfoque más directo es precompilar una clase desde un archivo fuente de clojure que inicia su aplicación. Su función -main debería llamar finalmente a algo como (run-jetty #'engine {:port 8080}).

Aquí hay un buen tutorial si usted no está familiarizado con Clojure por delante de tiempo de compilación ("AOT"): http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html

Entonces es una cuestión de crear un guión que lanza su aplicación con algo como java -cp you-uber.jar words.Main o somesuch.

Tenga en cuenta que el nombre de la clase "app launcher" y el nombre del jar final son completamente arbitrarios.

0

Usted podría utilizar lein ring uberjar. Eso comenzaría el servidor de anillo. Puede iniciar el otro servidor en el :init que proporciona el anillo de enlace.

Cuestiones relacionadas