2011-01-12 71 views
9

我試圖在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都是一件痛苦的事情。

回答

2

這可能與您的問題沒有任何關係,但我注意到有時候Tomcat過早地部署了一個WAR文件(特別是一個很大的文件),它沒有完全寫入webapps目錄。這不是Tomcat的錯;它無法知道文件何時完成。

我現在總是將WAR文件複製到正在運行的Tomcat中,方法是將它複製到webapp.war.disabled,然後重命名它:mv webapp.war.disabled webapp.war

+0

感謝您的提示,但沒有運氣:( – 2011-02-07 05:41:58

1

我做了幾乎相同的事情,但使用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。