0

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

但是,我遇到了一个问题,似乎在成功导入发票后,码头服务器将不再提供静态 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 的限制,似乎无法修复?

如何使用 Clojure 在命令行中更改目录?

4

1 回答 1

0

在这方面似乎并没有太多可以做的事情。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 "/")

并将文件放在我项目根目录中的资源/公共目录中。

于 2010-12-06T03:19:30.640 回答