7

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?

3 Answers 3

5

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 
Sign up to request clarification or add additional context in comments.

Comments

4

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.

Comments

0

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.