2012-08-27 4 views
5

私はTomcatで実行している既存のJava Webアプリケーションを持っています。これには基本的なClojureサポートが追加されています。当面は、クラスパス上のリソースとしてClojureソースファイルをインクルードし、clojure.lang.RTを呼び出しています。原始的ですが、うまく動作します。TomcatでのClojureコードの再ロード

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

多くの無駄なグーグルの後に私が考えたのは、WebappClassLoader.resourceEntriesからの入力を手動で削除するために反射を使用することです。awfulです。

私は何かが欠けているはずです。

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

答えて

2

あなたはそこでWebappClassLoaderの行動を迂回することはできません。何ですか? doは、その管轄区域外にロードされているコードを移動します。例えば$CATALINA_HOME/libまで、hereと記載されている。

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

これはWebappClassLoaderの司法権と、うまくいけばそのセマンティクスからあなたを出してくれるでしょう。 (親クラスローダーからロードされたものをキャッシュすると、IMOが完全に壊れているように見えます)。

+0

ありがとうございました。私はこれについて少し考えなければならない。 'lib'に物を入れるのはそれほど便利ではありません。 '* use-context-classloader *'が他のものを壊さずに影響を与えるかどうか疑問です。 –

+0

@DaveRay '* use-context-classloader *'はデフォルトでtrueです。これをfalseに設定すると、Clojure自体をロードしたClassLoaderを経由してロードされます(ClojureがWebアプリケーションからロードされた場合)、または破損を引き起こす(つまり、$ CATALINA_HOME/libにclojure.jarを入れた場合) 'しかし、Webアプリケーションからコードを読み込もうとする)。 Q:WebアプリケーションからREPLサーバーを起動し、接続してコードをロードするのはなぜですか? – cemerick

+0

ありがとうございます。たぶん私はちょうど私はこのためのREPLサーバーを使用する方法で十分な創造的ではない:)ディスク上のいくつかのファイルに渡ってコードの束を持っていると言う。私は、レプリケートサーバーが稼働しているTomcatを起動します。 –

0

ClojureソースファイルをWEB-INFに置くことはできますか?その後、これはTomcatのソースからの非キャッシュされたGroovyクラスをロードするために、過去に私のために働いた

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

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResourceAsStream(java.lang.Stringを使用してそれらを読むことができます。

+0

そういう形でファイルをロードするのに 'clojure.lang.RT'を得ることができたらうまくいくようです。それ以外の場合、 '(require 'foo:reload)'は引き続きコンテキストクラスローダーを使用します。 –

0

cachingAllowedフラグに関連していますか?here?ちょうど青の中に撃つ。私はこれがキャッシュされていないネット上で発言を発見した

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

0

か、線に沿って何かをするのClojureのパッチを適用したバージョンを使用します。

+0

'(io/resource)'はコンテキストクラスローダーを使用するので、Tomcatを経由してキャッシュされます。 :( –

+0

@ dave-ray '.getResource'(' io/resource'によって使われる)がキャッシュされていないという主張を見つけました。私はTomcatを知らないので、とにかくこれはすべて推測です。 – kotarak

関連する問題