2011-01-12 6 views
9

Sto tentando di distribuire un file WAR scritto in Clojure su Tomcat 6 su Debian Lenny.NPE che installa un WAR Clojure in Tomcat, riavvia le correzioni

Ricevo una NullPointerException quando la copio nella cartella webapps (sia per il primo tipo che per la sovrascrittura di una guerra esistente). Stranamente, il riavvio di Tomcat risolve il problema e il servlet funziona correttamente. Ho confezionato la WAR con leiningen-war (anche provato lein-ring). Il servlet funziona bene quando si usa Jetty.

Ecco la voce corrispondente di registro da 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) 

Ecco la fonte, semplificato per il minimo indispensabile:

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

rilevanti dipendenze Lein:

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

ho fatto in modo non ci sono JAR duplicati nella directory di distribuzione di WAR e Tomcat.

Sono in perdita. Qualcuno sa cosa c'è di sbagliato o avere suggerimenti per la risoluzione dei problemi? Dover riavviare Tomcat su ogni schieramento è un rompicapo.

risposta

2

Questo può o non può avere nulla a che fare con il tuo problema, ma ho notato che a volte Tomcat distribuisce prematuramente un file WAR (specialmente uno grande) che non è stato scritto completamente nella directory webapps. Questa non è colpa di Tomcat; non può sapere quando il file è completo.

Ora copio sempre un file WAR in un Tomcat in esecuzione copiandolo, ad esempio, webapp.war.disabled e quindi rinominandolo: mv webapp.war.disabled webapp.war.

+0

Grazie per il suggerimento, ma senza fortuna :( –

1

Ho fatto quasi la stessa cosa ma ho usato tomcat 5.5.34 e ha funzionato.

ho aggiunto questa dipendenza per project.clj:

[ring "1.0.0-RC1"] 

ho aggiunto questo dev-dipendenza project.clj:

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

ho aggiunto la configurazione ad anello a project.clj e fatto in modo la mia funzione di gestione è stato nominato 'handler':

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

mi sono imbattuto Lein uberwar anello poi ho rinominato il resu lting war file in modo che non contenga "-1.0.0-SNAPSHOT.standalone" nel nome prima di copiare il file war nella directory webapps/tomcat.

Ho dimenticato di dire che stavo usando clojure 1.3.0.

Problemi correlati