NPE在Tomcat中安装Clojure WAR,重启修复程序

Jus*_*mer 9 java deployment tomcat clojure war

我正在尝试将在Clojure中编写的WAR文件部署到Debian Lenny上的Tomcat 6中.

当我将它复制到webapps目录(第一种类型和覆盖现有战争时)时,我得到一个NullPointerException.奇怪的是,重启Tomcat可以解决问题,并且servlet运行正常.我用leiningen-war包装了WAR(也试过了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)
Run Code Online (Sandbox Code Playgroud)

这是源代码,简化为最低限度:

(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)
Run Code Online (Sandbox Code Playgroud)

相关的lein依赖:

[org.clojure/clojure "1.2.0"]
[ring/ring-core "0.3.4"]
[ring/ring-servlet "0.3.4"]
Run Code Online (Sandbox Code Playgroud)

我确保WAR和Tomcat的lib目录中没有重复的JAR.

我不知所措.有人知道什么是错的或有疑难解答提示吗?必须在每次部署时重新启动Tomcat都是一个痛苦的屁股.

Chr*_*ert 2

这可能与您的问题有任何关系,也可能没有关系,但我注意到有时 Tomcat 会过早地部署尚未完全写入 webapps 目录的 WAR 文件(尤其是大文件)。这不是 Tomcat 的错;而是 Tomcat 的错。它无法知道文件何时完成。

现在,我总是将 WAR 文件复制到正在运行的 Tomcat 中,例如将其复制到,webapp.war.disabled然后重命名为:mv webapp.war.disabled webapp.war.