Reputation: 13173
I got clojure project with ring library in it. This is project.clj:
(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 development environment I run it with 2 commands: lein run server lein ring server and it's works.
For production environment I want to minimize dependencies and build it into standalone jar with:
lein uberjar
How can I build it and run both of servers from one jar file?
Upvotes: 7
Views: 2689
Reputation: 8417
You could use lein ring uberjar
. That would start the ring server. You could start the other server in the :init
hook lein-ring provides.
Upvotes: 0
Reputation: 6234
Regarding to
:main words.play
I advice you to implement -main
function in words.play
something like
(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")))
Note, that :gen-class
is necessary in namespace definition:
(ns words.play
(:gen-class))
Implementation for start-server1
and start-server2
should depend on concrete frameworks: (run-jetty ...)
for ring, (start-http-server ...)
for aleph and so on (you can find more info in relative documentation).
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
Upvotes: 5
Reputation: 10311
The most straightforward approach is to pre-compile a class from a clojure source file that starts your application. Your -main
function should ultimately call something like (run-jetty #'engine {:port 8080})
.
Here's a good tutorial if you're not familiar with Clojure ahead-of-time compilation ("aot"): http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html
Then it's a matter of creating a shell script that launches your application with something like java -cp you-uber.jar words.Main
or somesuch.
Note that the name of your "app launcher" class and final jar name are completely arbitrary.
Upvotes: 4