我得到了clojure项目,里面有环形库。这是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})
在开发环境中,我用两个命令运行它:lein运行服务器lein环形服务器它是有效的。
对于生产环境,我想最大限度地减少依赖性,并将其构建到具有以下功能的独立jar中:
lein uberjar
如何从一个jar文件构建并运行这两个服务器?
关于
:main words.play
我建议你在words.play
中实现-main
功能,比如
(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")))
注意,:gen-class
在名称空间定义中是必要的:
(ns words.play
(:gen-class))
start-server1
和start-server2
的实现应该依赖于具体的框架:(run-jetty ...)
用于环,(start-http-server ...)
用于aleph等等(您可以在相关文档中找到更多信息)。
用法:
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
最直接的方法是从启动应用程序的clojure源文件预编译类。-main
函数最终应该调用类似(run-jetty #'engine {:port 8080})
的函数。
如果您不熟悉Clojure提前编译("aot"),这里有一个很好的教程:http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html
然后就是创建一个shell脚本,用java -cp you-uber.jar words.Main
之类的东西启动应用程序。
请注意,"应用程序启动器"类的名称和最终的jar名称是完全任意的。
您可以使用lein ring uberjar
。这将启动环形服务器。您可以在lein环提供的:init
钩子中启动另一台服务器。