【问题标题】:MYOB ODBC Driver changing working directory to temp using CompojureMYOB ODBC 驱动程序使用 Compojure 将工作目录更改为临时目录
【发布时间】:2011-04-24 03:56:28
【问题描述】:

我编写了一个小的内部 web 应用程序,用于将发票从我们的工作卡数据库导入到 MYOB。我使用 Clojure 和 Compojure 编写了它,它实际上运行良好,对我来说也是一个很好的学习练习。

但是,我遇到了一个问题,似乎在成功导入发票后,码头服务器将不再提供静态 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. "."))

我得到了我的临时文件目录的列表,这可以解释为什么我的 CSS 文件不再被找到。

奇怪的是,如果我这样做:

(.getAbsolutePath (File. "."))

我得到了我的应用程序的正确目录。

有没有人知道可以绕过 MYOB ODBC 驱动程序这个怪癖的东西(除了在绝对路径中编码)?

我猜我可以在启动时抓取并存储绝对路径,但是这可以与 uberjar 一起使用吗?

编辑: 由于JVM的限制,似乎无法修复?

How do I change directory in command line with Clojure?

【问题讨论】:

  • 奇怪的事情确实很奇怪。文件序列调用 (.d (listFiles)) 。如果调用 (.(File.".") listFiles) 会得到哪个目录?
  • 我得到了临时目录列表。 (seq (. (File. ".") (listFiles)))。但是,它仍然说 absolutePath 是正确的目录,所以我不确定那里发生了什么......

标签: clojure compojure myob


【解决方案1】:

在这方面似乎并没有太多可以做的事情。 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 时也可以正常工作。

所以我不再定义“静态路由”,我只是使用:

 (route/resources "/")

并在我的项目根目录下的资源/公共目录中保存文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2021-01-22
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多