jd.*_*jd. 4 clojure leiningen read-eval-print-loop nrepl
在Java 1.7.0_21 Java HotSpot(TM)64位服务器VM上运行Leiningen 2.3.4
我无法连接到nREPL服务器.
我使用了一个新项目lein new luminus,然后为drawbridge([com.cemerick/drawbridge "0.0.6"])添加了一个依赖项.
我加了一个处理器路线如下REPL(基于https://devcenter.heroku.com/articles/debugging-clojure):
(def drawbridge-handler
  (-> (cemerick.drawbridge/ring-handler)
      (wrap-keyword-params)
      (wrap-nested-params)
      (wrap-params)
      (wrap-session)))
(defn wrap-drawbridge [handler]
  (fn [req]
    (if (= "/repl" (:uri req))
      (drawbridge-handler req)
      (handler req))))
并添加wrap-drawbridge到我的中间件.
然后我使用启动服务器
lein ring server-headless
连接似乎运行良好,因为执行GET请求会http:localhost:3000/repl产生响应:["[\n","\n]"]
但我无法连接到REPL:
> lein repl :connect 0.0.0.0:3000/repl
Connecting to nREPL at 0.0.0.0:3000/repl
并且,过了一段时间:
SocketException The transport's socket appears to have lost its connection to the nREPL server
    clojure.tools.nrepl.transport/bencode/fn--4287/fn--4288 (transport.clj:95)
    clojure.tools.nrepl.transport/bencode/fn--4287 (transport.clj:95)
    clojure.tools.nrepl.transport/fn-transport/fn--4261 (transport.clj:42)
    clojure.core/binding-conveyor-fn/fn--4107 (core.clj:1836)
    java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334)
    java.util.concurrent.FutureTask.run (FutureTask.java:166)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
    java.lang.Thread.run (Thread.java:722)
Bye for now!
我错过了什么吗?
编辑:
将以下日志记录代码添加到我的处理程序
(defn wrap-drawbridge [handler]
  (fn [req]
    (if (= "/repl" (:uri req))
      (do (println "IN REPL ")
        (drawbridge-handler req))
      (handler req))))
当lein repl :connect http://localhost:3000/repl按照建议连接时,我看到IN REPL在服务器控制台上以无限循环打印的行.
这不是一个直接的答案,但我发现我并没有以正确的方式解决这个问题.
Luminus创建了一个project-name.repl应该用于交互式开发的命名空间.
我发现通过添加到我的身上,我可以做我想做的事 project.clj
:repl-options {
                  :init-ns project-name.repl
                  :init (start-server)}
然后简单地启动服务器lein repl.
比设置nREPL中间件简单得多!