NPE устанавливает Clojure WAR в Tomcat, перезапускает исправления - PullRequest
9 голосов
/ 12 января 2011

Я пытаюсь развернуть файл WAR, написанный на Clojure, в Tomcat 6 на Debian Lenny.

Я получаю исключение NullPointerException, когда копирую его в каталог веб-приложений (как для первого типа, так и при перезаписи существующей войны). Как ни странно, перезапуск Tomcat устраняет проблему, и сервлет работает нормально. Я упаковал WAR с leiningen-war (также попробовал lein-ring). Сервлет работает нормально при использовании Jetty.

Вот соответствующая запись в журнале 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)

Соответствующие зависимости lein:

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

Я убедился, что в WAR и директории lib Tomcat нет дубликатов JAR.

Я в растерянности. Кто-нибудь знает, что не так или есть советы по устранению неполадок? Необходимость перезапуска Tomcat при каждом развертывании - это боль в заднице.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Это может иметь или не иметь никакого отношения к вашей проблеме, но я заметил, что иногда Tomcat преждевременно развертывает WAR-файл (особенно большой), который не был полностью записан в каталог webapps.Это не вина Tomcat;он не может знать, когда файл завершен.

Теперь я всегда копирую файл WAR в работающий Tomcat, копируя его, скажем, в webapp.war.disabled, а затем переименовывая: mv webapp.war.disabled webapp.war.

1 голос
/ 15 ноября 2011

Я сделал почти то же самое, но использовал tomcat 5.5.34, и он работал.

Я добавил эту зависимость в project.clj:

[ring "1.0.0-RC1"]

Я добавил эту dev-зависимостьproject.clj:

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

Я добавил конфигурацию кольца в project.clj и убедился, что моя функция обработчика была названа 'handler':

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

Я запустил lein ring uberwar, затем япереименовал получившийся файл войны, чтобы он не содержал в имени «-1.0.0-SNAPSHOT.standalone» перед копированием файла войны в каталог webapps / tomcat.

Забыл упомянуть, что я использовалclojure 1.3.0.

...