重新加载getResourceAsStream加载的资源

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

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

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

然而,这种方法很脆弱。

有更标准的方法吗?

除了确实可能适用于Tomcat的kschneid的答案之外,我想补充一点,对于JBoss AS 5+它似乎已经可以工作而不需要任何特殊的技巧。

资源缓存可能是类加载器特定的。 JBoss AS要么不缓存,要么足够聪明,以确定磁盘上的资源已经更改。

尝试这个:

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

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