我试图在运行Apache Tomcat 7.0.59的Liferay容器中运行portlet。 portlet以几种方式之一引用Clojure代码:
我最关心的是第一个,但在所有情况下,当leiningen测试全部通过(并且它正在调用portlet正在调用的代码)时,我会频繁但间歇性错误部署了portlet / servlet或进行热部署时的tomcat。错误是代码I单元测试中的符号解析错误,单元测试正在通过:
at clojure.lang.RT.loadResourceScript(RT.java:370)
at clojure.lang.RT.loadResourceScript(RT.java:361)
at clojure.lang.RT.load(RT.java:440)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5066.invoke(core.clj:5641)
at clojure.core$load.doInvoke(core.clj:5640)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:379)
at portal_aot_common.CljJobManager.<clinit>(Unknown Source)
... 238 more
Caused by: java.lang.RuntimeException: Unable to resolve symbol: map->obj in this context
at clojure.lang.Util.runtimeException(Util.java:221)
at clojure.lang.Compiler.resolveIn(Compiler.java:6940)
at clojure.lang.Compiler.resolve(Compiler.java:6884)
at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6845)
at clojure.lang.Compiler.analyze(Compiler.java:6427)
... 285 more
代码不在WEB-INF/classes
目录或WEB-INF/lib
目录中的jar中;相反,我选择修改catalina.properties
文件并在common.loader
属性中包含src路径。我也尝试过使用tomcat 7的virtualwebapploader virtualClasspath属性。
问题在于,当它工作时,它完全有效。但似乎有50/50的机会,它不起作用,我得到上述错误。代码不在jar中(我喜欢能够修改代码并重新启动服务器而无需安装或构建任何东西)。
对于环uberwar,问题似乎是servlet无法在tomcat启动时找到处理程序类,但是当我构建战争并进行热部署时似乎没问题。 lein ring server
工作正常,但实际部署似乎有50/50的成功机会。
我使用的是clojure 1.6.0和java 8.
对于可能发生的事情的任何想法都将不胜感激。