Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新加载getResourceAsStream加载的资源_Java_Web Applications - Fatal编程技术网

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中尝试过,但它在那里不起作用(正如预期的那样)。