我写了一个小的内部网络应用程序,我用它将发票从我们的工作卡数据库导入到MYOB中。我用Clojure和Compojure编写了它,它实际上工作得很好,对我来说也是一个很好的学习练习。
但是,我有一个问题,似乎在成功导入发票后,jetty服务器将不再提供静态CSS文件。
解冻过程如下:
(defroutes static-routes
(GET ["/:filename" :filename #".*"] [filename]
(response/file-response filename {:root "public"})))(该文件只是css/default.css,在第一次导入之前它工作得很好。)
现在我想我已经找到了问题所在,似乎MYOB ODBC驱动程序正在更改Jetty服务器(和我的REPL)的工作目录,因为当我在REPL中输入以下内容时:
(file-seq (File. "."))我得到了我的临时文件目录的列表,这将解释为什么我的CSS文件不再被找到。
奇怪的是,如果我这样做了:
(.getAbsolutePath (File. "."))我得到了我的应用程序的正确目录。
有没有人知道可以绕过MYOB ODBC驱动程序这一怪癖的方法(除了在绝对路径中编码)?
我猜我可以在启动时抓取并存储绝对路径,但这对uberjar有效吗?
编辑:由于JVM中的限制,似乎不可能修复?
发布于 2010-12-06 11:19:31
对于这一点,似乎真的没有太多可以做的。看起来MYOB ODBC桥很糟糕。
因此,为了解决这个问题,我将我的相对文件调用替换为使用.getAbsolutePath。
例如:
(java.io.File. (.getAbsolutePath (java.io.File. "templates/index.html")))我还更改了它,以便静态文件请求使用绝对文件路径:
(defroutes static-routes
(GET ["/:filename" :filename #".*"] [filename]
(response/file-response filename {:root (.getAbsolutePath (java.io.File. "public"))})))我还没有尝试创建一个uberjar,所以我想我可能会在那里遇到一些问题。
这只是一个更新,使用Compojure的资源函数似乎完全跳过了问题,在创建UberJar时也没有问题。
所以我不再定义"static-routes“,我只需要使用:
(route/resources "/")并将这些文件放在项目根目录下的resources/public目录中。
https://stackoverflow.com/questions/3912349
复制相似问题