从我的应用程序中启动REPL

时间:2016-01-03 08:55:53

标签: clojure read-eval-print-loop

假设我已经为工作中的某些个人计算实现了一些功能。我想建立一个.jar(uberjar),我的同事也会在REPL中使用它,例如:

megacorpcalcs.core=> (+ 2 2)
4
megacorpcalcs.core=> (salary 8 0.4)
666$

我应该输入什么代码才能在.jar启动时启动REPL?

1 个答案:

答案 0 :(得分:4)

编辑:在您发表评论后,我已将此答案分成2个

<强> 1。使用REPL运行你的uberjar

创建你的uberjar,并以:

开始
java -cp /path/to/your/application-X.Y.Z-standalone.jar clojure.main -i @your_application/foo.clj -r

我必须添加-i参数并将其指向我的一个clj文件,以便让我在项目中的任何类实际加载到repl中。可能有更好的方法来做到这一点,但我还没有找到它。如果没有它,您将获得标准的clojure repl,但您的应用程序尚未加载。

注意,您需要@符号,以便从jar文件加载相对于类路径(即从jar的根目录)。

这应该启动一个repl,您可以在其中更改名称空间并运行您的应用程序功能。

此外,您可以安装rlwrap并在其前面添加java命令,以便您可以合理地使用历史记录和箭头键。

<强> 2。在您的应用程序中嵌入REPL服务器以连接到另一个客户端

您可以在启动应用程序时嵌入自己的repl(例如,只需启动一个repl实例的简单主程序),然后您的用户可以运行您的jar文件,并使用他们选择的工具单独连接到它(苹果酒 - jack-in,&lein repl connect ...&#39;)

简单版本是:

(start-server :port 7890 :handler cider-nrepl-handler)

替换所需的端口,请参阅下面的相关命名空间以进行导入。

这是一个更完整的例子:

(ns your-app.server
  (:gen-class)
  (:require [cider.nrepl :refer (cider-nrepl-handler)]
            [clojure.tools.nrepl.server :refer [start-server]]))

(def repl-server (atom nil))

(defn create-nrepl-server!
  [repl-port]
  (println (format "starting nrepl server on port %d" repl-port))
  (reset! repl-server (start-server :port repl-port :handler cider-nrepl-handler)))

(defn -main []
  ;;  ...
  (let [repl-port 7890]
    (create-nrepl-server! repl-port)
    (spit ".nrepl-port" repl-port)))

您的project.clj文件

中需要以下内容
:plugins        [[cider/cider-nrepl "0.10.0"]] ;; or whatever version you prefer
:dependencies   [[org.clojure/tools.nrepl "0.2.12"]]

连接到自定义repl后,将应用标准规则,只需更改命名空间并调用您的函数。

相关问题