我在Tomcat中运行了一个现有的Java webapp,我正在添加一些原始的Clojure支持。目前,我只是将Clojure源文件作为资源包含在类路径中并通过clojure.lang.RT
调用它。这是原始的,但工作正常。
但是,我注意到Tomcat的WebappClassLoader
缓存了通过getResourceAsInputStream()
检索到的资源,Clojure使用它来检索和编译源代码。也就是说,执行(require 'my-ns :reload)
只是重新加载文件的缓存版本,即使磁盘上有更新的文件也是如此。有没有办法绕过或避免Clojure文件的缓存?
我在谷歌搜索无效之后想出的最好的方法就是使用反射手动删除来自WebappClassLoader.resourceEntries
糟糕的条目。
我一定错过了什么。
“使用Jetty / Glassfish / JBoss”,“重启Tomcat”等答案不是我想要的。
答案 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"))
我在网上发现了一条没有缓存的评论。