【问题标题】:Compojure - how to start server from a function?Compojure - 如何从函数启动服务器?
【发布时间】:2016-03-01 14:36:11
【问题描述】:

我正在编写一个玩具应用程序来了解 Compojure,并将其用于数据库支持的 Web 应用程序。 我知道,如果我使用lein ring uberjar 编译,我可以创建一个在登录时自动启动服务器的 uberjar。现在我想尝试一个多功能的 .jar 文件,想法是在启动 jar 时我可以决定是要进行数据库管理还是启动服务器。

在我的 core.clj 中,我通过defroutes 定义了一些路由,并在:ring {:handler ...} 下的 project.clj 中提供了这些路由。

我现在的问题是:我怎样才能从一个函数启动环服务器,尽可能少的依赖和代码?

This issue 有从@9​​87654325@ 函数启动服务器的示例,但是使用了太多我无法解决的依赖关系,一些神秘的函数没有解释,而且几乎肯定会过时两年。

我在 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。我猜是被污染的命名空间阻止了它的工作。

【问题讨论】:

  • 是的,Compojure 与此无关。然而,环确实如此。如果您无法解决依赖关系,了解它们会有所帮助。
  • 是的,知道示例中的依赖关系正是问题所在,因为它们是导入的,但没有明确列出;有许多同名的 clojar 包。
  • 您是否阅读了在此期间给出的答案?有什么问题吗?
  • 是的,schauenho 的回答和链接帮助我确保我的代码一开始是正确的;愚蠢的我只需要开始一个新的 REPL 就可以了 - 我更新了问题。

标签: web-applications clojure compojure ring


【解决方案1】:

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

您可以在-main 函数中放弃对run-jetty 的调用。 Compojure 路由用作处理程序,因此您可以将它们作为参数删除到对run-jetty 的调用(如(jetty/run-jetty main-routes port)。

【讨论】:

  • 谢谢。这帮助我发现了问题,尤其是关于 compojure 路由充当处理程序的评论。
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2017-10-15
  • 2011-06-19
  • 2015-09-08
  • 2016-11-03
相关资源
最近更新 更多