2011-10-20 44 views
3

这是我的project.clj文件:的Compojure:访问文件系统

(defproject org.github.pistacchio.deviantchecker "0.9.0" 
    :description "A one page application for keeping track of changes on deviantart.com gallieries" 
    :dependencies [[org.clojure/clojure "1.2.1"] 
       [org.clojure/clojure-contrib "1.2.0"] 
       [enlive "1.0.0"] 
       [compojure "0.6.4"] 
       [ring/ring-jetty-adapter "1.0.0-beta2"]] 
    :dev-dependencies [[lein-ring "0.4.6"]] 
    :ring {:handler org.github.pistacchio.deviantchecker.core/app} 
    :main org.github.pistacchio.deviantchecker.core) 

,这我的路由:

(defroutes main-routes 
    (GET "/" [] (get-home)) 
    (GET "/add" [d] (add-gallery d)) 
    (GET "/delete" [d] (delete-gallery d)) 
    (GET "/check" [d] (check-gallery d)) 
    (route/resources "/") 
    (route/not-found "Page not found")) 

我有一些网站的静态文件中/resources/public,我可以访问它们。在代码中,我还需要访问文件系统上位于/resources/data/resources/tpl上的一些文件。使用lein ring服务器或lein run,下面的调用工作正常

(java.io.File. "resources/tpl/home.html") 

lein uberwar包装的应用和部署在Tomcat下失败时,我得到一个FileNotFoundException异常。也许这是因为在当前工作目录是项目根目录,而在Tomcat下它是Tomcat的bin目录。

例如,我有/resources/data/data.dat在战争中打包为/data/data.dat,所以“resources/data/data.dat”在Tomcat下无法运行或“data/data.dat”在开发中无法运行。

顺便说一句,在Compojure中管理这种方法的正确方法是什么?谢谢。

回答

1

您可以使用clojure.java.io/resource访问的资源是否是本地文件系统上,或者装在一个罐子里/战争:

(require '[clojure.java.io :as io]) 
(io/reader (io/resource "public/some/file.txt")) ; file in resource classpath or $root/resources/public... 

你可能不应该尝试从一个目录中加载它们,因为当从jar/war部署文件(或者甚至文件系统可能在文件系统中)时,您无法确定文件的最终位置。

+0

嗨,感谢您的提示,但这并不能解决问题。例如,我将$/resources/data/data.dat打包为$/data/data.dat,因此(io/resource“resources/data/data.dat”)在生产中不起作用或(io /资源“data/data.dat”)不适用于开发。 – pistacchio

+1

好的,它的工作。我还必须将:resource-path“resources /”添加到project.clj – pistacchio