我正在构建一个测试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但是我正在学习我希望它能像这样工作,然后再加入更多的库.这里发生了什么?
我认为这里发生的事情是这里的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 内部如何处理这个问题的内部工作......也就是说,我不知道它在哪里寻找基本路径。
| 归档时间: |
|
| 查看次数: |
2631 次 |
| 最近记录: |