我正在编写一个玩具应用程序来了解Compojure,并将其用于数据库支持的Web应用程序。
我知道,如果我使用lein ring uberjar
进行编译,我可以创建一个在登录时自动启动服务器的uberjar。现在我想尝试一个多功能的 .jar 文件,想法是在启动jar时我可以决定是否要进行数据库管理或启动服务器。
在我的 core.clj 中,我已经通过defroutes
定义了一些路由,并在:ring {:handler ...}
下的 project.clj 中提供了。
我现在的问题是:如何从一个函数启动环服务器,尽可能少的依赖关系和代码?
This issue有关于从-main
函数启动服务器的示例,但是使用了我无法解决的多个依赖项,一些没有解释的隐藏函数,并且几乎肯定已经过时了两个年。
我在Compojure文档和wiki中找不到任何提示,欢迎指向docs / tuts的提示。
编辑:来自schaueho的答案和戒指教程的工作版本:
(ns playground.core
(:require [ring.adapter.jetty :refer :all]
[compojure.core :refer :all]
[compojure.route :as route]))
(defroutes app-routes
(GET "/" [query]
(do (println "Server query:" query)
"<p>Hello from compojure and ring</p>"))
(route/resources "/")
(route/not-found "<h1>404 - Page not found</h1>"))
(run-jetty app-routes {:port 8080 :join? false})
出于某种原因,在重新启动REPL之前,调用run-jetty
会给我带有完全相同代码的ClassNotFoundExceptions。我猜一个污染的命名空间阻止了它的工作。
答案 0 :(得分:0)
请查看环文档的Getting started部分,了解使用Jetty的示例(就像lein ring
一样)。
您可以将run-jetty
功能中的-main
电话放弃。 Compojure路由充当处理程序,因此您可以将它们作为参数放到run-jetty
的调用中(如(jetty/run-jetty main-routes port)
中所示。