NPE在Tomcat中安装Clojure WAR,重新启动修复程序
我试图在Clojure中将Debian Lenny上的WAR文件部署到Tomcat 6上。NPE在Tomcat中安装Clojure WAR,重新启动修复程序
当我将它复制到webapps目录中时(第一种类型和覆盖现有战争时),我得到一个NullPointerException异常。奇怪的是,重新启动Tomcat可以解决问题,并且servlet运行良好。我用莱宁根战争打包了战争(也尝试过lein-ring)。使用Jetty时,servlet可以正常工作。
下面是从Tomcat相关的日志条目:
Jan 12, 2011 7:18:06 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet foobar
java.lang.NullPointerException
at clojure.lang.Var.invoke(Var.java:373)
at clojure.lang.AFn.applyToHelper(AFn.java:169)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.lang.Compiler.macroexpand1(Compiler.java:5286)
at clojure.lang.Compiler.macroexpand(Compiler.java:5341)
at clojure.lang.Compiler.eval(Compiler.java:5409)
at clojure.lang.Compiler.load(Compiler.java:5857)
at clojure.lang.RT.loadResourceScript(RT.java:340)
at clojure.lang.RT.loadResourceScript(RT.java:331)
at clojure.lang.RT.load(RT.java:409)
at clojure.lang.RT.load(RT.java:381)
at clojure.core$load$fn__4511.invoke(core.clj:4905)
at clojure.core$load.doInvoke(core.clj:4904)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at clojure.lang.Var.invoke(Var.java:365)
at foobar.servlet.<clinit>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
这里的来源,简化到最低限度:
(ns foobar.servlet
(:use [ring.util.servlet :only [defservice]])
(:gen-class :extends javax.servlet.http.HttpServlet))
(defn handler
[req]
{:status 200
:headers {"Content-type" "text/html"}
:body "hi"})
(defservice handler)
相关雷音依赖关系:
[org.clojure/clojure "1.2.0"]
[ring/ring-core "0.3.4"]
[ring/ring-servlet "0.3.4"]
我确信在WAR和Tomcat的lib目录中没有重复的JAR。
我不知所措。任何人都知道什么是错的或有疑难解答提示?不得不在每次部署中重新启动Tomcat都是一件痛苦的事情。
这可能与您的问题没有任何关系,但我注意到有时候Tomcat过早地部署了一个WAR文件(特别是一个很大的文件),它没有完全写入webapps目录。这不是Tomcat的错;它无法知道文件何时完成。
我现在总是将WAR文件复制到正在运行的Tomcat中,方法是将它复制到webapp.war.disabled
,然后重命名它:mv webapp.war.disabled webapp.war
。
我做了几乎相同的事情,但使用tomcat 5.5.34,它的工作。
添加此依赖性project.clj:
[ring "1.0.0-RC1"]
添加此DEV-依赖性project.clj:
:dev-dependencies [[lein-ring "0.4.6"]]
我添加了环配置project.clj并确保我的处理程序函数被命名为'处理程序':
:ring {:handler simple.webapp.core/handler}
我跑lein ring uberwar然后我改名为resu在war文件复制到tomcat的webapps /目录之前,使war文件不包含名称中的“-1.0.0-SNAPSHOT.standalone”。
忘了提及我正在使用clojure 1.3.0。
感谢您的提示,但没有运气:( – 2011-02-07 05:41:58