在Tomcat中重新加载Clojure代码

Dav*_*Ray 5 tomcat clojure

我在Tomcat中运行了一个现有的Java webapp,我正在添加一些原始的Clojure支持.目前,我只是将Clojure源文件作为资源包含在类路径中并调用它clojure.lang.RT.这是原始的,但工作正常.

但是,我注意到Tomcat的WebappClassLoader缓存资源通过getResourceAsInputStream()Clojure检索和编译源代码来检索.也就是说,(require 'my-ns :reload)即使磁盘上有更新的文件,也只是重新加载文件的缓存版本.有没有办法绕过或避免Clojure文件的缓存?

我想出了很多后无果而终google搜索最好是使用反射来手动删除该条目WebappClassLoader.resourceEntries这是可怕的.

我肯定错过了什么.

像"使用Jetty/Glassfish/JBoss","重启Tomcat"等答案并不是我想要的.

cem*_*ick 2

你将无法规避WebappClassLoader那里的行为。你能做的就是将正在加载的代码移到其管辖范围之外;$CATALINA_HOME/lib例如,最多,如此所述。

您还需要将所有依赖项移到那里,将实际部署为 web 应用程序的 .war 文件保留为一个小 shell,该 shell 期望所有代码已经在其他地方可用。

这将使您摆脱 的WebappClassLoader管辖范围,并希望也摆脱它的语义。(如果它缓存从父类加载器加载的内容,那么在我看来,这似乎完全被破坏了。)