2012-08-22 15 views
7

Ho ottenuto il progetto clojure con la libreria ad anello al suo interno. Questo è project.clj:Come creare l'applicazione clojure con il server anulare

(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}) 

In ambiente di sviluppo l'eseguo con 2 comandi: server di run Lein server di anello Lein ed è opere.

Per ambiente di produzione voglio minimizzare le dipendenze e costruire in vaso autonomo con:

lein uberjar 

Come posso costruire ed eseguire entrambi i server da un file jar?

risposta

5

Riguardo al

:main words.play 

consiglio che voi per implementare -main funzione nel words.play qualcosa come

(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, che :gen-class è necessario definizione dello spazio dei nomi:

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

Implementazione per start-server1 e start-server2 dovrebbero dipendere da strutture concrete: (run-jetty ...) per anello, (start-http-server ...) per aleph e così via (è possibile trovare maggiori informazioni nella relativa documentazione).

Usage:

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

L'approccio più semplice è precompilare una classe da un file sorgente clojure che avvia l'applicazione. La tua funzione -main dovrebbe in definitiva chiamare qualcosa come (run-jetty #'engine {:port 8080}).

Ecco un buon tutorial se non hai familiarità con Clojure ahead-of-time compilation ("AOT"): http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html

Poi è una questione di creare uno script di shell che lancia l'applicazione con qualcosa di simile java -cp you-uber.jar words.Main o somesuch.

Si noti che il nome della classe "lanciatore di app" e il nome del vaso finale sono completamente arbitrari.

0

Si potrebbe usare lein ring uberjar. Quello avvierebbe il ring server. È possibile avviare l'altro server nel file :init hook lein-ring.

Problemi correlati