2011-01-12 15 views
9

Próbuję wdrożyć plik WAR napisany w Clojure do Tomcat 6 na Debianie Lenny.NPE instaluje Clojure WAR w Tomcat, restartuje poprawki

Otrzymuję wyjątek NullPointerException po skopiowaniu go do katalogu webapps (zarówno dla pierwszego typu, jak i przy nadpisywaniu istniejącej wojny). O dziwo, ponowne uruchomienie Tomcat rozwiązuje problem, a serwlet działa dobrze. Pakowałem wojnę z leiningen-war (również wypróbowałem lein-ring). Serwlet działa poprawnie podczas korzystania z Jetty.

Oto odpowiedni wpis w rejestrze od 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) 

Oto źródło, uproszczone do minimum:

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

Istotne Zależności Lein:

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

Upewniłem nie ma duplikatów plików JAR w katalogu WAR i katalogu lib Tomcat.

Brakuje mi. Czy ktoś wie, co jest nie tak lub ma wskazówki dotyczące rozwiązywania problemów? Konieczność ponownego uruchomienia Tomcata przy każdym wdrożeniu to ból w tyłku.

Odpowiedz

2

To może ale nie musi mieć nic wspólnego z twoim problemem, ale zauważyłem, że czasami Tomcat przedwcześnie wdraża plik WAR (szczególnie duży), który nie został całkowicie zapisany w katalogu webapps. To nie jest wina Tomcat; nie wie, kiedy plik jest kompletny.

Teraz zawsze kopiuję plik WAR do działającego Tomcat, kopiując go na, powiedzmy, webapp.war.disabled, a następnie zmieniając jego nazwę na: mv webapp.war.disabled webapp.war.

+0

Dzięki za napiwek, ale bez powodzenia :( –

1

Zrobiłem prawie to samo, ale użyłem tomcat 5.5.34 i zadziałało.

I dodaje tę zależność na project.clj:

[ring "1.0.0-RC1"] 

Po dodaniu tego dev-zależność do project.clj:

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

I dodaje konfigurację pierścieniową z project.clj i upewnić się, funkcja mojego handlera została nazwana "handler":

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

Uruchomiłem leber ring uberwar, a następnie zmieniłem nazwę resu plik wojenny, który nie zawierał "-1.0.0-SNAPSHOT.standalone" w nazwie przed skopiowaniem pliku wojennego do katalogu/katalogów tomcat'a.

Zapomniałem wspomnieć, że używałem clojure 1.3.0.

Powiązane problemy