2011-01-20 32 views
12

ベストプラクティスに従って、ファイルAPIを使用する代わりにThread.currentThread().getContextClassLoader().getResourceAsStreamを使用して、Webアプリケーション(テキストファイルやXMLファイルなど)でリソースを読み込みます。getResourceAsStreamによってロードされたリソースをリロードする

しかし、これは、ディスク上のリソースが変更された場合、次のgetResourceAsStreamの呼び出しによって古いバージョンが無期限に返されるという欠点があります。

私は新しいバージョンを手に入れたいと思います。私のデバッガでは、classLoaderにresourceEntriesという単純なHashMapがあります。リフレクションを使用して、特定のエントリを削除できましたが、これはうまくいくようです。

しかし、この方法は脆弱です。

もっと標準的な方法がありますか?

+0

これを保持する 'ClassLoader'の正確な実装は何ですか? – Bozho

+0

この場合は、Tomcat 5の '' org.apache.catalina.loader.WebappClassLoader''でした。私は新しいTomcatバージョンではまだ試していませんが、JBossで試してみました。予想通り)。 – akira

答えて

1

が実際にTomcatのために働くかもしれないkschneidの答えに加えて、私は既に特別なトリックを必要とせずに動作するようです5+のJBoss ASのためにそれを追加したいです。

リソースのキャッシュは、おそらくクラスローダ固有です。 JBoss ASは、キャッシュしないか、ディスク上のリソースが変更されたことを確認するのに十分スマートです。

6

これを試してみてください:

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader(); 
URL resURL = ctxLoader.getResource(resName); 
URLConnection resConn = resURL.openConnection(); 
resConn.setUseCaches(false); 
InputStream resIn = resConn.getInputStream(); 
... 
関連する問題