5

Tomcat で実行されている既存の Java Web アプリケーションに、いくつかの基本的な Clojure サポートを追加しています。とりあえず、Clojure のソース ファイルをリソースとしてクラスパスに含めて、clojure.lang.RT. 原始的ですが、うまく機能します。

ただし、 Clojure がソース コードの取得とコンパイルに使用する、取得したWebappClassLoaderリソースを Tomcat がキャッシュしていることに気付きました。getResourceAsInputStream()つまり(require 'my-ns :reload)、更新されたファイルがディスク上にある場合でも、キャッシュされたバージョンのファイルを再ロードするだけです。Clojure ファイルのこのキャッシュを回避または回避する方法はありますか?

実りのないグーグル検索の後に思いついた最善の方法は、リフレクションを使用して、ひどいWebappClassLoader.resourceEntriesエントリを手動で削除することです。

私は何かが欠けているに違いない。

「Jetty/Glassfish/JBoss を使用する」、「Tomcat を再起動する」などの回答は、私が探しているものではありません。

4

4 に答える 4

2

WebappClassLoaderそこでの の動作を回避することはできません。できることは、ロードされているコードをその管轄外に移動することです。ここで$CATALINA_HOME/lib説明されているように、たとえば まで。

すべての依存関係もそこに移動する必要があります。実際に webapp として展開する .war ファイルは、すべてのコードが既に他の場所で利用可能であることを期待する小さなシェルとして残します。

これによりWebappClassLoader、 の管轄外になり、できればそのセマンティクスからも解放されます。(親クラスローダーからロードされたものをキャッシュする場合、IMO が完全に壊れているように見えます。)

于 2012-08-27T19:07:10.563 に答える
0

これは、ここでcachingAllowed説明されているフラグに関連していますか? 青に撃ち込むだけです。

于 2012-08-28T05:55:52.510 に答える
0

Clojure のソース ファイルを の下に置くことはできますWEB-INFか? 次に、 http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResourceAsStream(java.lang.String )を使用してそれらを読み取ることができます。

servletContext.getResourceAsStream("/WEB-INF/foo/core.clj");

これは、過去にTomcatのソースからキャッシュされていないGroovyクラスをロードするために機能しました。

于 2012-08-27T19:23:39.363 に答える
0

または、ラインに沿って何かを行う clojure のパッチを適用したバージョンを使用します。

(io/input-stream (io/resource "bla.clj"))

これはキャッシュされていないという発言をネットで見つけました。

于 2012-08-28T06:05:41.113 に答える