7

我得到了带有环库的 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})

在开发环境中,我使用 2 个命令运行它: lein run server lein ring server 并且它可以工作。

对于生产环境,我想最小化依赖关系并将其构建到独立的 jar 中:

lein uberjar

如何构建它并从一个 jar 文件运行两台服务器?

4

3 回答 3

5

关于

:main words.play

我建议您以类似的方式实现-main功能words.play

(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-server1start-server2应该依赖于具体的框架:(run-jetty ...)for ring、(start-http-server ...)for 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
于 2012-08-24T10:06:21.793 回答
4

最直接的方法是从启动应用程序的 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 名称是完全任意的。

于 2012-08-22T16:10:21.770 回答
0

你可以使用lein ring uberjar. 那将启动环服务器。:init您可以在lein-ring 提供的钩子中启动其他服务器。

于 2013-06-22T04:43:57.563 回答