我写了一些内部网络应用程序,用于将发票从我的作业卡数据库导入MYOB。我用Clojure和Compojure编写了它,它实际上运行得很好,对我来说这也是一个很好的学习练习。
但是,我遇到了问题,似乎在成功导入发票后,jetty服务器将不再提供静态CSS文件。
defroute如下:
(defroutes static-routes
(GET ["/:filename" :filename #".*"] [filename]
(response/file-response filename {:root "public"})))
(该文件只是css / default.css,它在第一次导入之前就完美无缺。)
现在我觉得我发现了问题,似乎MYOB ODBC驱动程序正在更改Jetty服务器(和我的REPL)的工作目录,因为当我在REPL中输入以下内容时:
(file-seq (File. "."))
我得到了我的Temp文件目录列表,这可以解释为什么我的CSS文件不再被找到。
奇怪的是,如果我这样做:
(.getAbsolutePath (File. "."))
我得到了我的应用程序的正确目录。
有没有人知道可以解决MYOB ODBC驱动程序的这个问题的某些事情(除了在绝对路径中编码)?
我猜我可以在启动时抓住并存储绝对路径,但是这会与uberjar一起工作吗?
编辑: 由于JVM的限制,似乎无法修复?
答案 0 :(得分:0)
对此,似乎没有太多可以做的事情。看来MYOB ODBC桥只是坏了。
所以为了解决这个问题,我已经用相对文件调用替换了.getAbsolutePath。
e.g。
(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时也没有问题。
所以我不再定义“静态路由”,我只是使用:
(route/resources "/")
将我的资源/公共目录中的文件放在项目的根目录中。