使用ring/compojure从war包中提供静态文件服务

15

使用 Ring(和 lein-ring 工具)时,我可以按照文档在开发环境下从“resources”等位置提供静态文件服务。但是,当我通过 lein uberwar 将它们打包后,在容器中运行时,我不知道该如何提供这些文件的服务。我看到关于 wrap-resource 或设置 :resource-path 的文档有冲突,但似乎都不起作用。


对于Google App Engine,我可以直接将静态文件放在war/目录中。模板文件(我使用soy)实际上留在resource/目录中,并以某种方式编译到war目录中。我猜想这在你的情况下不可能或者行不通? - Paul
2个回答

24
根据Compojure的入门Wiki,请将route/resources放置在您的路径下:

(defroutes main-routes
  (GET "/" [] "<h1>Hello World Wide Web!</h1>")
  (route/resources "/")
  (route/not-found "Page not found"))

然后,在您的项目中创建一个名为resources/public的文件夹,并将静态文件放在其中。当引用这些文件时,/resources/public是隐含的,因此您可以编写类似以下的内容:(include-css "/css/site.css")

这里是部署到CloudBees的示例


2
这应该是 resources/public 而不是 resrouce/public 吧? - kristianlm
1
对不起,Michael, 我拼写不好! 我想说的是resources文件夹应该用复数形式。 - kristianlm

20

compojure.route/resources应该可以满足您的需求。

只需将文件放置在resources/public中,然后在路由列表末尾添加一个路由(resources "/")

为了使这个功能正常工作,您需要使用相当新的lein-ring版本;旧版本的lein-ring不支持公共资产资源目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接