2011-01-12 8 views
9

Estoy intentando desplegar un archivo WAR escrito en Clojure a Tomcat 6 en Debian Lenny.NPE instalando un Clojure WAR en Tomcat, reinicie las correcciones

Obtengo una NullPointerException cuando la copio en el directorio webapps (tanto para el primer tipo como para sobrescribir una guerra existente). Curiosamente, reiniciar Tomcat soluciona el problema y el servlet funciona bien. Empaqueté WAR con leiningen-war (también intenté con lein-ring). El servlet funciona bien cuando se usa Jetty.

Aquí está la entrada correspondiente registro de 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) 

Aquí está la fuente, simplificada al mínimo:

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

dependencias Lein pertinentes:

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

Me aseguré no hay JAR duplicados en WAR y en el directorio de lib de Tomcat.

Estoy perdido. ¿Alguien sabe lo que está mal o tiene consejos para la resolución de problemas? Tener que reiniciar Tomcat en cada implementación es un dolor en el trasero.

Respuesta

2

Esto puede o no tener algo que ver con su problema, pero he notado que a veces Tomcat implementa prematuramente un archivo WAR (especialmente uno grande) que no se ha escrito completamente en el directorio webapps. Esto no es culpa de Tomcat; no puede saber cuándo el archivo está completo.

Ahora siempre copio un archivo WAR en un Tomcat en ejecución copiándolo en, por ejemplo, webapp.war.disabled y luego renombrándolo: mv webapp.war.disabled webapp.war.

+0

Gracias por el consejo, pero no hubo suerte :( –

1

Hice casi lo mismo pero utilicé Tomcat 5.5.34 y funcionó.

I añadió esta dependencia a project.clj:

[ring "1.0.0-RC1"] 

I añadió esta dev-dependencia a project.clj:

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

añadí la configuración de anillo a project.clj y se aseguró mi función de controlador fue nombrado 'manipulador':

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

me encontré uberwar anillo Lein entonces a llamarse el resu lting war file para que no contenga el "-1.0.0-SNAPSHOT.standalone" en el nombre antes de copiar el archivo war en el directorio webapps/de tomcat.

Olvidé mencionar que estaba usando clojure 1.3.0.

Cuestiones relacionadas