2011-01-12 6 views
9

Ich versuche eine WAR-Datei in Clojure zu Tomcat 6 auf Debian Lenny zu implementieren.NPE eine Clojure WAR in Tomcat installieren, Fixes neu starten

Ich bekomme eine NullPointerException, wenn ich es in das Verzeichnis webapps kopiere (sowohl für den ersten Typ als auch beim Überschreiben eines bestehenden Krieges). Seltsamerweise behebt der Neustart von Tomcat das Problem und das Servlet läuft gut. Ich verpackte den Krieg mit Leiningen-Krieg (auch versucht Lein-Ring). Das Servlet funktioniert einwandfrei, wenn Jetty verwendet wird.

Hier ist der entsprechende Protokolleintrag von 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) 

Hier ist die Quelle, auf das absolute Minimum vereinfacht:

(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) 

Relevante lein Abhängigkeiten:

[org.clojure/clojure "1.2.0"] 
[ring/ring-core "0.3.4"] 
[ring/ring-servlet "0.3.4"] 

Ich stellte sicher, Es gibt keine doppelten JARs in WAR und Tomcat's lib dir.

Ich bin ratlos. Wer weiß, was los ist oder Tipps zur Fehlerbehebung? Tomcat bei jedem Einsatz neu starten zu müssen, ist ein Ärgernis.

Antwort

2

Dies kann oder darf nicht mit Ihrem Problem zu tun haben, aber ich habe festgestellt, dass Tomcat vorzeitig eine WAR-Datei (vor allem eine große), die nicht vollständig in das Webapps-Verzeichnis geschrieben wurde. Das ist nicht Tomcat's Schuld; Es kann nicht wissen, wann die Datei vollständig ist.

Ich kopiere jetzt immer eine WAR-Datei in einen laufenden Tomcat, indem ich es zum Beispiel in webapp.war.disabled kopiere und es dann umbenenne: mv webapp.war.disabled webapp.war.

+0

Danke für den Tipp, aber kein Glück :( –

1

Ich tat fast das Gleiche, aber Tomcat 5.5.34 verwendet und es hat funktioniert.

habe ich diese Abhängigkeit project.clj:

[ring "1.0.0-RC1"] 

ich diese dev-Abhängigkeit hinzugefügt project.clj:

:dev-dependencies [[lein-ring "0.4.6"]] 

ich den Ring-Konfiguration hinzugefügt sicher project.clj und machte Meine Handler-Funktion wurde "Handler" genannt:

:ring {:handler simple.webapp.core/handler} 

Ich lief Lein Ring Uberwar dann habe ich das Resu umbenannt lege die WAR-Datei so an, dass sie den Namen "-1.0.0-SNAPSHOT.standalone" nicht enthält, bevor du die WAR-Datei in das webapps/-Verzeichnis von tomcat kopierst.

Vergessen zu erwähnen, dass ich Clojure 1.3.0 verwendet habe.