Compojure - 如何从函数启动服务器?

时间:2015-11-27 11:40:05

标签: web-applications clojure compojure ring

我正在编写一个玩具应用程序来了解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。我猜一个污染的命名空间阻止了它的工作。

1 个答案:

答案 0 :(得分:0)

请查看环文档的Getting started部分,了解使用Jetty的示例(就像lein ring一样)。

您可以将run-jetty功能中的-main电话放弃。 Compojure路由充当处理程序,因此您可以将它们作为参数放到run-jetty的调用中(如(jetty/run-jetty main-routes port)中所示。