5

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

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

经过多次无果的谷歌搜索后,我想到的最好的方法是使用反射手动删除WebappClassLoader.resourceEntries糟糕条目。

我肯定错过了什么。

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

4

4 回答 4

2

您将无法规避WebappClassLoader' 那里的行为。您可以做的是将正在加载的代码移到其管辖范围之外;例如高达,如此$CATALINA_HOME/lib所述。

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

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

于 2012-08-27T19:07:10.563 回答
0

你能把 Clojure 源文件放在下面WEB-INF吗?然后您可以使用http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResourceAsStream(java.lang.String )阅读它们

servletContext.getResourceAsStream("/WEB-INF/foo/core.clj");

过去,这对我有用,可以从 Tomcat 中的源代码加载未缓存的 Groovy 类。

于 2012-08-27T19:23:39.363 回答
0

这与此处cachingAllowed描述的标志有关吗?只是射向蓝色。

于 2012-08-28T05:55:52.510 回答
0

或者使用 clojure 的补丁版本,它可以执行以下操作:

(io/input-stream (io/resource "bla.clj"))

我在网上找到了一个评论,这个没有缓存。

于 2012-08-28T06:05:41.113 回答