我有一个Clojure应用程序,我可以在命令行和Compojure应用程序中使用它。
我通过在我的leiningen clojure.tools.cli
中放置一个环处理程序和一个主函数(project.clj
)来做到这一点。
{...
:main my-app.core
:ring {:handler my-app.handler/handler }}
handler
定义为(defroutes handler ...)
。
现在,如果我想运行CLI应用程序,我可以运行lein uberjar
,然后运行java -jar arguments
。
我还可以通过lein ring server PORT
运行Compojure应用程序。
现在,如何在生产服务器中将事物部署为Compojure应用程序(而不是CLI应用程序)? (用于解释lein ring server
如何工作的奖励积分。)
注意:如果可以提供帮助,我已经使用了nginx,并且我对要使用的容器非常灵活。
答案 0 :(得分:2)
这是我用于新项目的默认模板。它允许您对环应用程序执行依赖项注入,并从命令行运行应用程序作为uberjar。您可以在此处阅读更多内容:http://www.sparxeng.com/blog/software/improved-clojure-workflow
; handler.clj
(defn wrap-inject-deps
"Ring middleware that injects the dependencies into each ring request map"
[handler deps]
(fn [req]
(handler (assoc req :deps deps))))
(defn create-handler
"Similar to the default ring 'handler', but with a parameter to let you inject dependencies"
[deps]
(-> (routes
api-routes
web-routes
(route/resources "/"))
(kwp/wrap-keyword-params)
(params/wrap-params)
(json/wrap-json-params)
(json/wrap-json-response)
(wrap-inject-deps deps))) ; this injects dependencies
(defn start-jetty
"Launch the Jetty instance"
[deps]
(let [port (Integer. (or (-> system :env :port) 5000))
handler (create-handler deps)]
(jetty/run-jetty handler {:port port :join? false})))
; system.clj
(defn get-env
"Initialize configuration vars"
[]
{:aws-access-key-id (System/getenv "AWS_ACCESS_KEY_ID")
:aws-secret-access-key (System/getenv "AWS_SECRET_ACCESS_KEY")
:mongo-url (System/getenv "MONGO_URL"))
(defn start
"Launch dependencies such as DB connection and Jetty. Return these as a map, for use in REPL"
[& [env]]
(let [env (or env (get-env))
deps {:env env
:monger (db/init env)}
jetty (handler/start-jetty deps)]
(assoc deps :jetty jetty)))
; program.clj
(defn -main [& [port]]
"App entrypoint"
(let [env (system/get-env) ; "env" is just a map of config variables, that can be hard-coded, read from file, or whatever you want.
env (if port (assoc env :port port) env)]
(system/start env)))
如果您需要使用代码库中的不同入口点创建多个应用,则可以使用leiningen配置文件。
答案 1 :(得分:1)
lein ring server
启动jetty以投放您已构建的网络应用程序。它通过使用您在:ring
中指定的选项启动服务器来完成此操作。如果在环境中指定LEIN_NO_DEV
,则服务器将以生产模式运行。码头是否适合您的制作需要,由您决定。
如果您想在其他服务器上运行Web应用程序,则有多个选项。其中一个是在Tomcat上运行。再看一下lein ring的文档,特别是关于war文件的部分。基本上,您可以致电lein war
或lein uberwar
来生成war文件。你可以,例如将war文件放入Tomcat的webapps
目录。
另一种选择是使用immutant,其中包含有关安装和运行应用程序的大量文档。