【发布时间】:2016-03-01 14:36:11
【问题描述】:
我正在编写一个玩具应用程序来了解 Compojure,并将其用于数据库支持的 Web 应用程序。
我知道,如果我使用lein ring uberjar 编译,我可以创建一个在登录时自动启动服务器的 uberjar。现在我想尝试一个多功能的 .jar 文件,想法是在启动 jar 时我可以决定是要进行数据库管理还是启动服务器。
在我的 core.clj 中,我通过defroutes 定义了一些路由,并在:ring {:handler ...} 下的 project.clj 中提供了这些路由。
我现在的问题是:我怎样才能从一个函数启动环服务器,尽可能少的依赖和代码?
This issue 有从@987654325@ 函数启动服务器的示例,但是使用了太多我无法解决的依赖关系,一些神秘的函数没有解释,而且几乎肯定会过时两年。
我在 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