8

どのように機能するかを学ぶために、テスト clojure/ring プロジェクトを構築しています。「junkapp」と呼ぶアプリを作成しましたが、実際には1つのハンドラーがあります

(defn handler [request]
  {:status 200
  :headers {"Content-type" "text/html"}
  :body "Hello World"})

また、静的コンテンツ用の wrap-resource への 1 回の呼び出し

(def app
  (wrap-resource handler "public"))

したがって、私の project.clj には lein-ring への参照があり、:handler をjunkapp.core/app に設定しています。

:plugins [[lein-ring "0.8.5"]]
:ring {:handler junkapp.core/app}

これを lein run で実行すると、すべてが期待どおりに機能します。/ を呼び出すと「Hello World」が返され、/test.html を呼び出すと resources/public/test.html の内容が返されます。

しかし、それをwarファイルにビルドしようとしました

lein ring uberwar junkapp.war

tomcat7 サーバーの webapps/ ディレクトリの下に配置します。現在、junkapp (/junkapp/、/junkapp/foo、/junkapp/test.html) の下のパスに移動すると、常に「Hello World」が返され、静的コンテンツをまったく参照できないようです。グーグルでは、人々が compojure.route/resources を使用するように言っているのを見ていますが、私が学んでいるように、このように機能し、後でライブラリを追加したいと考えています。何が起きてる?

4

2 に答える 2

2

ここで起こっているのは、 wrap-resources here、具体的には次の行にいくつかのコードがあることだと思います:

(or ((head/wrap-head #(resource-request % root-path)) request)
  (handler request))))

war ファイルとしてビルドすると、静的コンテンツを提供するために使用するパスのルートが WEB-INF/classes/ であることが認識されません。つまり、 public/test.html を別の場所 (おそらく .war のルート?) で探しているため、この "or" が false であるため、ハンドラーを直接呼び出すことになります。

Tomcat がこれを内部でどのように処理しているかについての内部作業が完全にはわからないため、これに対する修正についてはわかりません...つまり、基本パスを見つけるためにどこを探しているのかわかりません。

于 2013-06-26T19:51:23.813 に答える