在Tomcat中运行Clojure代码

时间:2015-04-18 18:30:19

标签: java tomcat clojure liferay portlet

我试图在运行Apache Tomcat 7.0.59的Liferay容器中运行portlet。 portlet以几种方式之一引用Clojure代码:

  • 1):gen-class:impl-ns(这个命名空间是编译好的,impl-ns命名空间不是)
  • 2)Clojure.var(" clojure.core"," require")。invoke(Clojure.read(ns));然后在返回的IFN上调用invoke(ns也是一个非aot编译的命名空间)
  • 3)响uberwar(这不是portlet)

我最关心的是第一个,但在所有情况下,当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.

对于可能发生的事情的任何想法都将不胜感激。

0 个答案:

没有答案