Java 在Tomcat中运行Clojure代码

Java 在Tomcat中运行Clojure代码,java,tomcat,clojure,liferay,portlet,Java,Tomcat,Clojure,Liferay,Portlet,我正在尝试在运行ApacheTomcat7.0.59的Liferay容器中运行portlet。portlet以以下几种方式之一引用Clojure代码: 1) :gen class:impl ns(此命名空间是aot编译的,而impl ns命名空间不是) 2) var(“Clojure.core”,“require”).invoke(Clojure.read(ns));然后对返回的IFN调用invoke(ns也是一个非aot编译的命名空间) 3) ring uberwar(这不是一个portle

我正在尝试在运行ApacheTomcat7.0.59的Liferay容器中运行portlet。portlet以以下几种方式之一引用Clojure代码:

  • 1) :gen class:impl ns(此命名空间是aot编译的,而impl ns命名空间不是)
  • 2) var(“Clojure.core”,“require”).invoke(Clojure.read(ns));然后对返回的IFN调用invoke(ns也是一个非aot编译的命名空间)
  • 3) ring uberwar(这不是一个portlet)
我最关心的是第一个,但在所有情况下,当leiningen测试全部通过(并且它调用portlet调用的代码)时,我在启动tomcat并部署portlet/servlet或进行热部署时,会经常出现间歇性错误。这些错误是我已经单元测试过的代码中的符号解析错误,并且单元测试正在通过:

  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
位于clojure.lang.RT.loadResourceScript(RT.java:370)
位于clojure.lang.RT.loadResourceScript(RT.java:361)
在clojure.lang.RT.load处(RT.java:440)
在clojure.lang.RT.load处(RT.java:411)
在clojure.core$load$fn__5066.invoke处(core.clj:5641)
在clojure.core$load.doInvoke(core.clj:5640)
位于clojure.lang.RestFn.invoke(RestFn.java:408)
在clojure.lang.Var.invoke(Var.java:379)
在portal_aot_common.CljJobManager(未知源)
... 238更多
原因:java.lang.RuntimeException:无法在此上下文中解析符号:map->obj
位于clojure.lang.Util.runtimeException(Util.java:221)
位于clojure.lang.Compiler.resolveIn(Compiler.java:6940)
位于clojure.lang.Compiler.resolve(Compiler.java:6884)
位于clojure.lang.Compiler.AnalyzeSymble(Compiler.java:6845)
位于clojure.lang.Compiler.analyze(Compiler.java:6427)
... 285更多
代码不在
WEB-INF/classes
目录中,也不在
WEB-INF/lib
目录中的jar中;相反,我选择修改
catalina.properties
文件,并在
common.loader
属性中包含src路径。我还尝试使用Tomcat7的virtualwebapploader virtualClasspath属性

问题是,当它起作用时,它完全起作用。但似乎总有50/50的几率它不起作用,我得到了上面的错误。代码不在jar中(我喜欢能够修改代码并重新启动服务器,而无需安装或构建任何东西)

对于ring uberwar,问题似乎是servlet在tomcat启动时找不到处理程序类,但在我构建war并进行热部署时似乎没有问题
lein-ring服务器
工作正常,但实际部署似乎有50/50的成功机会

我正在使用Clojure1.6.0和Java8

如果您对可能发生的事情有任何想法,我们将不胜感激