带有clojure和ring的静态文件

时间:2013-06-26 15:01:39

标签: clojure ring

我正在构建一个测试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但是我正在学习我希望它能像这样工作,然后再加入更多的库。这是怎么回事?

2 个答案:

答案 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