我正在构建一个测试clojure / ring项目以了解它是如何工作的。我创建了一个名为“junkapp”的应用程序,它实际上有一个处理程序
(defn handler [request]
{:status 200
:headers {"Content-type" "text/html"}
:body "Hello World"})
还有一次调用静态内容的wrap-resource
(def app
(wrap-resource handler "public"))
那么在我的project.clj中我引用了lein-ring并且还设置了:handler to junkapp.core / app
:plugins [[lein-ring "0.8.5"]]
:ring {:handler junkapp.core/app}
当我使用lein run运行时,一切都按预期工作。调用/返回“Hello World”并调用/test.html会返回resources / public / test.html的内容。
但后来我尝试使用
将其构建为war文件lein ring uberwar junkapp.war
并将其放在tomcat7服务器的webapps / dir下。现在,当我去junkapp下的任何路径(so / junkapp /,/ junkapp / foo,/ junkapp / test.html)时,它总是返回“Hello World”,我似乎无法让它完全引用静态内容。在谷歌上搜索我看到人们只是说要使用compojure.route / resources但是我正在学习我希望它能像这样工作,然后再加入更多的库。这是怎么回事?
答案 0 :(得分:2)
我认为这里发生的事情是wrap-resources here中有一些代码,特别是这一行:
(or ((head/wrap-head #(resource-request % root-path)) request)
(handler request))))
当构建为war文件时,它不会理解WEB-INF / classes /是它应该用于提供静态内容的路径的根。所以它正在寻找其他地方的public / test.html(也许是.war的根?)所以这个“或”是假的,所以它直接调用处理程序。
我不确定是否已解决这个问题因为我不完全确定tomcat如何在内部处理这个内部工作...也就是说,我不知道它在寻找基本路径的位置。
答案 1 :(得分:1)
来自我的handler.clj(我正在使用compojure和lib-noir)
; defroutes and route/* being from Compojure
(defroutes app-routes
(route/resources "/")
(route/not-found "Not Found"))
(def all-routes [admin-routes home-routes blog-routes app-routes])
(def app (-> (apply routes all-routes)
; etc. etc.
(def war-handler (middleware/war-handler app))
现在我不知道预期WAR会如何表现的细节,但是让我们从lib-noir注意这个战争处理程序:
(defn war-handler
"wraps the app-handler in middleware needed for WAR deployment:
- wrap-resource
- wrap-file-info
- wrap-base-url"
[app-handler]
(-> app-handler
(wrap-resource "public")
(wrap-file-info)
(wrap-base-url)))
示例应用程序CMS:https://github.com/bitemyapp/neubite/
Compojure(路由):https://github.com/weavejester/compojure
在Noir之后收获的一些有用的实用工具:https://github.com/noir-clojure/lib-noir