【问题标题】:Reloading resources loaded by getResourceAsStream重新加载由 getResourceAsStream 加载的资源
【发布时间】:2011-01-20 15:34:27
【问题描述】:

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

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

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

但是这种方法很脆弱。

有没有更标准的方法来做到这一点?

【问题讨论】:

  • ClassLoader 的确切实现是什么?
  • 在这种情况下,它是 Tomcat 5 中的 org.apache.catalina.loader.WebappClassLoader。我还没有尝试过更新的 Tomcat 版本,但我只是在 JBoss 中尝试过,它在那里不起作用(如预期的那样) .

标签: java web-applications


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

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

    资源的缓存可能是特定于类加载器的。 JBoss AS 要么没有缓存,要么足够聪明,可以看到磁盘上的资源发生了变化。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-11-16
        • 1970-01-01
        • 2021-07-25
        • 2014-12-17
        • 1970-01-01
        • 2017-03-20
        • 2014-07-30
        • 2012-11-15
        • 1970-01-01
        相关资源
        最近更新 更多