带有clojure和ring的静态文件

Mic*_*elB 7 clojure ring

我正在构建一个测试clojure/ring项目来了解它是如何工作的.我创建了一个名为"junkapp"的应用程序,它实际上只有一个处理程序

(defn handler [request]
  {:status 200
  :headers {"Content-type" "text/html"}
  :body "Hello World"})
Run Code Online (Sandbox Code Playgroud)

还有一个调用静态内容的wrap-resource

(def app
  (wrap-resource handler "public"))
Run Code Online (Sandbox Code Playgroud)

那么在我的project.clj中我引用了lein-ring并且还设置了:handler到我的junkapp.core/app

:plugins [[lein-ring "0.8.5"]]
:ring {:handler junkapp.core/app}
Run Code Online (Sandbox Code Playgroud)

当我用lein run运行它时,一切都按预期工作.调用/返回"Hello World"并调用/test.html将返回resources/public/test.html的内容.

但后来我尝试用它构建一个war文件

lein ring uberwar junkapp.war
Run Code Online (Sandbox Code Playgroud)

并将其放在tomcat7服务器的webapps/dir下.现在,当我去junkapp下的任何路径(so/junkapp /,/ junkapp/foo,/ junkapp/test.html)时,它总是返回"Hello World",我似乎无法让它完全引用静态内容.在谷歌上搜索我看到人们只是说要使用compojure.route/resources但是我正在学习我希望它能像这样工作,然后再加入更多的库.这里发生了什么?

Mic*_*elB 2

我认为这里发生的事情是这里的wrapper-resources中有一些代码,特别是这一行:

(or ((head/wrap-head #(resource-request % root-path)) request)
  (handler request))))
Run Code Online (Sandbox Code Playgroud)

发生的情况是,当构建为 war 文件时,它不明白 WEB-INF/classes/ 是它应该用来提供静态内容的路径的根。所以它正在其他地方寻找 public/test.html (也许是 .war 的根?),所以这个“或”是假的,所以它会直接调用处理程序。

我不确定是否可以解决这个问题,因为我不完全确定 tomcat 内部如何处理这个问题的内部工作......也就是说,我不知道它在哪里寻找基本路径。