在Tomcat中重新加载Clojure代码

时间:2012-08-27 17:37:26

标签: tomcat clojure

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

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

我在谷歌搜索无效之后想出的最好的方法就是使用反射手动删除来自WebappClassLoader.resourceEntries 糟糕的条目。

我一定错过了什么。

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

4 个答案:

答案 0 :(得分:2)

你无法绕过WebappClassLoader那里的行为。您可以做的是移动在其辖区之外加载的代码;例如最高为$CATALINA_HOME/lib,如here所述。

您还需要移动所有依赖项,将实际部署的.war文件保留为一个小型shell,并希望所有代码都可以在其他地方使用。

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

答案 1 :(得分: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类。

答案 2 :(得分:0)

这与here描述的cachingAllowed标志有关吗?只是拍到蓝色。

答案 3 :(得分:0)

或者使用修补版本的clojure,它可以做一些事情:

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

我在网上发现了一条没有缓存的评论。