appengine magic, почти доволен, но получаю нулевой указатель на repl

У меня есть веб-приложение (созданное с помощью appengine-magic и lein), работающее на dev_appserver.sh, но, поскольку мне нужно больше интерактивности и меньше перезапуска сервера, я предпочитаю использовать repl. Теперь проблема в том, что после того, как я делаю (require '[appengine-magic.core :as ae]), (use 'myapp.core) и пытаюсь обслуживать приложение (ae/serve myapp), я получаю это исключение:

[Thrown class java.lang.NullPointerException]

Backtrace:
  0: java.io.File.<init>(File.java:360)
  1: sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  2: sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
  3: sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
  4: java.lang.reflect.Constructor.newInstance(Constructor.java:513)
  5: clojure.lang.Reflector.invokeConstructor(Reflector.java:160)
  6: appengine_magic.core$start.doInvoke(core_local.clj:85)
  7: clojure.lang.RestFn.invoke(RestFn.java:439)
  8: appengine_magic.core$serve.doInvoke(core_local.clj:139)
  9: clojure.lang.RestFn.invoke(RestFn.java:410)
 10: user$eval2264.invoke(NO_SOURCE_FILE:1)
 11: clojure.lang.Compiler.eval(Compiler.java:5424)
 12: clojure.lang.Compiler.eval(Compiler.java:5391)
 13: clojure.core$eval.invoke(core.clj:2382)
 14: swank.commands.basic$eval_region.invoke(basic.clj:47)
 15: swank.commands.basic$eval_region.invoke(basic.clj:37)
 16: swank.commands.basic$eval807$listener_eval__808.invoke(basic.clj:71)
 17: clojure.lang.Var.invoke(Var.java:365)
 18: user$eval2262.invoke(NO_SOURCE_FILE)
 19: clojure.lang.Compiler.eval(Compiler.java:5424)
 20: clojure.lang.Compiler.eval(Compiler.java:5391)
 21: clojure.core$eval.invoke(core.clj:2382)
 22: swank.core$eval_in_emacs_package.invoke(core.clj:92)
 23: swank.core$eval_for_emacs.invoke(core.clj:239)
 24: clojure.lang.Var.invoke(Var.java:373)
 25: clojure.lang.AFn.applyToHelper(AFn.java:167)
 26: clojure.lang.Var.applyTo(Var.java:482)
 27: clojure.core$apply.invoke(core.clj:540)
 28: swank.core$eval_from_control.invoke(core.clj:99)
 29: swank.core$eval_loop.invoke(core.clj:104)
 30: swank.core$spawn_repl_thread$fn__493$fn__494.invoke(core.clj:309)
 31: clojure.lang.AFn.applyToHelper(AFn.java:159)
 32: clojure.lang.AFn.applyTo(AFn.java:151)
 33: clojure.core$apply.invoke(core.clj:540)
 34: swank.core$spawn_repl_thread$fn__493.doInvoke(core.clj:306)
 35: clojure.lang.RestFn.invoke(RestFn.java:397)
 36: clojure.lang.AFn.run(AFn.java:24)
 37: java.lang.Thread.run(Thread.java:680)

Я также пробовал (in-ns 'myapp.core), но тот же эффект. Когда я вставляю обработчик веб-приложения прямо в repl и обслуживаю, он работает, но не из моего файла.

вызов myapp или myapp-handler явно дает "объект", поэтому я действительно должен быть в правильном пространстве имен...

проект.clj

(defproject myapp "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [
        [org.clojure/clojure "1.2.1"]
        [compojure "0.6.2"]
        ]
  :dev-dependencies [
            [appengine-magic "0.4.1"]
            [ring/ring-devel "0.3.7"]
            ])

core.clj очень прост:

(ns myapp.core
    (:use compojure.core)
    (:require [appengine-magic.core :as ae]))

(defroutes myapp-handler
    (GET "/" req
       {:status 200
        :headers {"Content-Type" "text/plain"}
        :body "Hello, world!!!"}))

(ae/def-appengine-app myapp #'myapp-handler)

person MarkokraM    schedule 05.04.2011    source источник
comment
возможно, с большим количеством трассировки стека (часть, связанная с вашим кодом) я мог бы помочь больше. Мне было бы легче воспроизвести это, если бы у меня был проект .clj (при условии, что leiningen) для проекта.   -  person Arthur Ulfeldt    schedule 06.04.2011
comment
Это все трассировки стека, которые я могу получить от emacs, и файл проекта очень прост. У меня есть кольцевая разработка для перезагрузки, но я не использую ее в этом случае.   -  person MarkokraM    schedule 06.04.2011
comment
Я должен сказать, что получаю ту же ошибку, были ли идеи о том, как это решить?   -  person toofarsideways    schedule 11.04.2011


Ответы (3)


Какой реп вы используете? Я повторил ваш проект, но добавил

[swank-clojure "1.3.0-SNAPSHOT"]

к :dev-зависимостям. Запустите реплику слизи с помощью команды lein swank, а затем используйте slime-connect, чтобы подключиться к ней из emacs. Затем я использовал те же команды, что и вы, то есть (require '[appengine-magic.core: as ae]), (use 'myapp.core) и (ae/serve myapp), все работает нормально.

Привет, Колин

person colinf    schedule 06.04.2011
comment
Я использовал и lein repl, и lein swank, но с swank, который поставлялся с библиотеками appengine-magic. И странно, сегодня, когда я удалил весь код из файла и вставил его обратно точно так же, как в моем примере, ошибок больше не было! Я видел это странное поведение на PHP пару раз, на ядре нет видимых ошибок, но синтаксический анализ или выполнение просто не работают. Может быть, это невидимые символы, я не знаю... но теперь он работает, точно такой же код, который я представил по моему вопросу... - person MarkokraM; 06.04.2011
comment
Очень странно, но, по крайней мере, сейчас это работает. Надеюсь так и останется! - person colinf; 07.04.2011

попробуйте запустить "lein clean" в папке проекта перед вызовом (ae/serve myapp).

У меня была аналогичная проблема, когда я компилировал код AOT, который вызывал проблемы. Я обсудил это с создателем appengine-magic, и он предложил удалить скомпилированные классы AOT, запустив lein clean, что решило эту проблему.

person toofarsideways    schedule 17.04.2011

Этот симптом (NPE в java.io.File.<init>) также может быть вызван ошибочным прохождением, например. обработчик var на ae/serve, а не var, созданный макросом def-appengine-app.

person Blake Miller    schedule 06.12.2014