使用Leiningen在Clojure中访问项目目录外的JSON文件

4

我正在使用Leiningen构建一个小型的Clojure Web应用程序。我有一些JSON文件需要访问,我也会使用服务器上运行的批处理进程每晚更新这些文件。我在本地使用Leiningen,但想要部署一个Uberjar到服务器上。有没有办法可以压缩在Jar文件中的JSON文件或访问位于Uberjar之外的JSON文件。现在我正在尝试在Compojure路由中使用ring.util.response/resource-response来实现后者:

      (GET "/json/:filename" [filename] 
        (resp/resource-response 
          (str filename ".json") 
          {:root "~/internal_dashboard/app/json/"}))

当我的应用程序尝试访问文件时,我收到了404错误。有人知道可能的解决方案吗?
3个回答

3

JVM不会扩展路径中的~,请调用System/getenv获取主目录并构建路径。

{:root (str (System/getenv "HOME") "/internal_dashboard/app/json/")}

Tomcat通常作为它自己的用户运行,因此请确保您将其放在正确的主目录中或完全拼写出路径。还可能需要配置Tomcat以访问该目录。


0

0

resp/resource-response用于与jar打包在一起的资源服务,所以并不适合用于单独更新应用程序之外的文件。

对于您的情况,我认为Ring的resp/file-response更适合。它允许从文件系统的指定位置提供文件,这样可以将json文件与应用程序分开。

类似于这样:

(GET "/json/:filename" [filename] (resp/file-response
                                    (str filename ".json")
                                    {:root "/some/folder/"}))

确切的文件夹名称可能应该来自配置或系统环境,正如Sean所建议的那样。


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