tomcat - 在 Tomcat 中重新加载 Clojure 代码

标签 tomcat clojure

我有一个在 Tomcat 中运行的现有 Java 网络应用程序,我正在向其添加一些原始的 Clojure 支持。目前,我只是将 Clojure 源文件作为资源包含在类路径中,并通过 clojure.lang.RT 调用它。 .它很原始,但工作正常。

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

在谷歌搜索多次无果之后,我想出的最好办法是使用反射手动删除 WebappClassLoader.resourceEntries 中的条目。这很很糟糕

我一定是漏掉了什么。

“使用 Jetty/Glassfish/JBoss”、“重启 Tomcat”等答案不是我要找的。

最佳答案

您将无法规避 WebappClassLoader 的行为。您可以做的是将正在加载的代码移出其管辖范围;例如直到 $CATALINA_HOME/lib,如 here 所述.

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

这将使您脱离 WebappClassLoader 的管辖范围,并希望它的语义也是如此。 (如果它缓存从父类加载器加载的东西,那似乎完全破坏了 IMO。)

关于tomcat - 在 Tomcat 中重新加载 Clojure 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12146761/

相关文章:

java - 寻找 Java EE 视频教程

java - 已编译的 JSP Java (*__jsp.java) 文件在哪里?

functional-programming - 返回前 X 位设置的数字

recursion - 如何为递归函数的每次迭代收集多个项目

android - GCM HTTP 状态 500 - Servlet.init() - 未发送通知 -

tomcat - 如何在不使用 eclipse 的情况下在 ubuntu 终端中为单个指定上下文启动 tomcat 服务器?

java - Tomcat session 未运行

clojure - 在 clojure 中覆盖代理中的多元方法

clojure - 在不同格式的 map 上调度函数调用

clojure.tools/命名空间刷新失败,错误代码为 "No namespace: foo"