遵循最佳做法,我使用Thread.currentThread().getContextClassLoader().getResourceAsStream
加载Web应用程序中的资源(如文本文件或xml文件),而不是通过文件API。
但是,这样做的缺点是,如果资源在磁盘上发生更改,则对getResourceAsStream的以下调用将无限期地返回旧版本。
我希望它能够拿到新版本。在我的调试器中,我看到classLoader中有一个名为resourceEntries的简单HashMap。使用反射我已经能够删除一个特定的条目,这似乎有效。
这种方法很脆弱。
有更标准的方法吗?
答案 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文件名解决了这个问题,每次更改资源内容时,我都会用当前时间戳更改新名称