0

ジョブカード データベースから MYOB に請求書をインポートするために使用する小さな内部 Web アプリケーションを作成しました。私は 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 の制限により修正できないようですか?

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 "/")

また、プロジェクトのルート ディレクトリにある resources/public ディレクトリにファイルを配置します。

于 2010-12-06T03:19:30.640 に答える