重新加载getResourceAsStream加载的资源

时间:2011-01-20 15:34:28

标签: java web-applications

遵循最佳做法,我使用Thread.currentThread().getContextClassLoader().getResourceAsStream加载Web应用程序中的资源(如文本文件或xml文件),而不是通过文件API。

但是,这样做的缺点是,如果资源在磁盘上发生更改,则对getResourceAsStream的以下调用将无限期地返回旧版本。

我希望它能够拿到新版本。在我的调试器中,我看到classLoader中有一个名为resourceEntries的简单HashMap。使用反射我已经能够删除一个特定的条目,这似乎有效。

这种方法很脆弱。

有更标准的方法吗?

3 个答案:

答案 0 :(得分:6)

试试这个:

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
URL resURL = ctxLoader.getResource(resName);
URLConnection resConn = resURL.openConnection();
resConn.setUseCaches(false);
InputStream resIn = resConn.getInputStream();
...

答案 1 :(得分:1)

除了kschneid的答案可能对Tomcat确实有用之外,我想补充一点,对于JBoss AS 5+来说它似乎已经无需任何特殊技巧了。

资源缓存可能是特定于类加载器的。 JBoss AS要么不缓存,要么足够智能,以确定磁盘上的资源已经发生变化。

答案 2 :(得分:0)

我终于通过更改jar文件名解决了这个问题,每次更改资源内容时,我都会用当前时间戳更改新名称