2011-10-20 45 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