Java 重新加载getResourceAsStream加载的资源
按照最佳实践,我使用Java 重新加载getResourceAsStream加载的资源,java,web-applications,Java,Web Applications,按照最佳实践,我使用Thread.currentThread().getContextClassLoader().getResourceAsStream来加载web应用程序中的资源(如文本文件或xml文件),而不是通过文件API 但是,这样做的缺点是,如果磁盘上的资源发生更改,下面对getResourceAsStream的调用会无限期地返回旧版本 我想它拿起新版本虽然。在我的调试器中,我看到类加载器中有一个名为resourceEntries的简单HashMap。使用反射,我已经能够删除一个特定的
Thread.currentThread().getContextClassLoader().getResourceAsStream
来加载web应用程序中的资源(如文本文件或xml文件),而不是通过文件API
但是,这样做的缺点是,如果磁盘上的资源发生更改,下面对getResourceAsStream的调用会无限期地返回旧版本
我想它拿起新版本虽然。在我的调试器中,我看到类加载器中有一个名为resourceEntries的简单HashMap。使用反射,我已经能够删除一个特定的条目,这似乎是可行的
然而,这种方法是脆弱的
有更标准的方法吗?试试这个:
ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
URL resURL = ctxLoader.getResource(resName);
URLConnection resConn = resURL.openConnection();
resConn.setUseCaches(false);
InputStream resIn = resConn.getInputStream();
...
除了kschneid的答案可能对Tomcat有效之外,我还想补充一点,对于JBossAS5+来说,它似乎已经在不需要任何特殊技巧的情况下工作了
资源的缓存可能是特定于类加载器的。JBoss本身要么不缓存,要么足够聪明,可以看到磁盘上的资源发生了变化。我最终通过更改jar文件名解决了这个问题,每次更改资源内容,我用当前时间戳更改了一个新名称类加载器的具体实现是什么?在本例中,它是Tomcat 5中的一个
org.apache.catalina.loader.WebappClassLoader
。我还没有在更新的Tomcat版本中尝试过,但我只是在JBoss中尝试过,但它在那里不起作用(正如预期的那样)。