我有一个在 Tomcat 中运行的现有 Java 网络应用程序,我正在向其添加一些原始的 Clojure 支持。目前,我只是将 Clojure 源文件作为资源包含在类路径中,并通过 clojure.lang.RT
调用它。 .它很原始,但工作正常。
但是,我注意到 Tomcat 的 WebappClassLoader
缓存通过 getResourceAsInputStream()
检索到的资源Clojure 使用它来检索和编译源代码。也就是说,做 (require 'my-ns :reload)
即使磁盘上有更新的版本,也只是重新加载文件的缓存版本。有没有办法规避或避免这种 Clojure 文件缓存?
在谷歌搜索多次无果之后,我想出的最好办法是使用反射手动删除 WebappClassLoader.resourceEntries
中的条目。这很很糟糕。
我一定是漏掉了什么。
“使用 Jetty/Glassfish/JBoss”、“重启 Tomcat”等答案不是我要找的。p>
最佳答案
您将无法规避 WebappClassLoader
的行为。您可以做的是将正在加载的代码移出其管辖范围;例如直到 $CATALINA_HOME/lib
,如 here 所述.
您还需要将所有依赖项移到那里,将您实际部署为 web 应用程序的 .war 文件保留为一个小外壳,它希望所有代码都已在其他地方可用。
这将使您脱离 WebappClassLoader
的管辖范围,并希望它的语义也是如此。 (如果它缓存从父类加载器加载的东西,那似乎完全破坏了 IMO。)
关于tomcat - 在 Tomcat 中重新加载 Clojure 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146761/