2012-08-22 9 views
7

erstellen Ich habe Clojure-Projekt mit Ring-Bibliothek drin. Dies ist project.clj:Wie man Clojure-Anwendung mit Ring-Server

(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 Entwicklungsumgebung ich es mit 2 Befehle ausführen: lein Lauf Server lein Ring Server und es ist funktioniert.

Für Produktionsumgebung Ich möchte Abhängigkeiten minimieren und in Standalone-Glas bauen mit:

lein uberjar 

Wie kann ich es bauen und beide Server von einer JAR-Datei ausführen?

Antwort

5

In Bezug auf

:main words.play 

ich Rat Sie -main Funktion in words.play so etwas wie

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

Hinweis zu implementieren, dass :gen-class in Namespace-Definition erforderlich ist:

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

Implementierung für start-server1 und start-server2 sollte von konkreten Frameworks abhängen: (run-jetty ...) für Ring, (start-http-server ...) für Aleph und so weiter (Sie können mehr Informationen in der relativen Dokumentation finden).

Verbrauch:

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

Der einfachste Ansatz ist die Vorkompilierung einer Klasse aus einer Clojure-Quelldatei, die Ihre Anwendung startet. Ihre -main Funktion sollte schließlich so etwas wie (run-jetty #'engine {:port 8080}) aufrufen.

Hier ist ein gutes Tutorial, wenn Sie mit Clojure-Voraus-Kompilierung nicht vertraut sind („AOT“): es ist eine Frage ein Shell-Skript zu schaffen, wie http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html

Dann mit etwas, das Ihre Anwendung startet java -cp you-uber.jar words.Main oder sowas.

Beachten Sie, dass der Name Ihrer App-Launcher-Klasse und der endgültige Jar-Name völlig willkürlich sind.

0

könnten Sie lein ring uberjar verwenden. Das würde den Ringserver starten. Du könntest den anderen Server im :init Hook-Lein-Ring starten.