如何在我的Clojure应用程序中嵌入REPL?

时间:2014-08-05 22:36:38

标签: clojure leiningen nrepl cider

我试图在我的clojure应用程序中嵌入cider.nrepl,以便我可以连接到正在运行的实例,检查,修复等。

我在我的leiningen个人资料档案中包含cider-nrepl

:plugins [[cider/cider-nrepl "0.7.0"]]

然后在我的core.clj

(:require (cheshire [core :as c])
            [byte-streams :as bs]
            [clojail [core :as jail] [testers :as testers]]
            [clojure.tools.nrepl [server :as nrepl-server]]
            [cider.nrepl :refer (cider-nrepl-handler)])

(defn -main [& args]
  (println "Starting up REPL")
  (nrepl-server/start-server :bind "0.0.0.0" :port 7888 :handler cider-nrepl-handler))

程序编译并运行正常。但是当我尝试连接到端口7888中的REPL会话时,我得到以下堆栈跟踪:

  

错误:未处理的REPL处理程序异常处理消息{:id   0da185f2-38e8-4a83-9941-327b9806176b,:op clone}   java.lang.NoClassDefFoundError:clojure / tools / nrepl / StdOutBuffer at at   clojure.tools.nrepl.middleware.session $ session_out.invoke(session.clj:26)     在   clojure.tools.nrepl.middleware.session $ create_session.invoke(session.clj:118)     在   clojure.tools.nrepl.middleware.session $ create_session.invoke(session.clj:114)

目前还不确定如何处理。谷歌搜索StdOutBuffer也没有帮助。

更新 这是我的完整project.clj

(defproject ruler "1.0"
  :description "Autopal Rule Server"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [clojail "1.0.6"]
                 [com.rmoquin.bundle/jeromq "0.2.0"]
                 [cheshire "5.2.0"]
                 [byte-streams "0.1.10"]
                 [clj-time "0.7.0"]]
  :aot [ruler.core]
  :main ruler.core)

如上所述,cider-nrepl通过leiningen的个人档案文件包含在内。

1 个答案:

答案 0 :(得分:3)

我认为问题在于对cider / cider-repl的依赖是你的个人资料中的插件依赖。如果你的项目依赖于那个lib,它应该在你的project.clj依赖项中。

lein配置文件适用于要在开发期间使用但不在生产中使用的库,因此它们不包含在war / jar / uberjar工件中。