从我的应用程序中启动 REPL

Gra*_*Gra 5 clojure read-eval-print-loop

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

megacorpcalcs.core=> (+ 2 2)
4
megacorpcalcs.core=> (salary 8 0.4)
666$
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*her 8

编辑:在你发表评论后,我把这个答案分成了 2 个

1. 使用 REPL 运行 uberjar

创建你的 uberjar,并启动它:

java -cp /path/to/your/application-X.Y.Z-standalone.jar clojure.main -i @your_application/foo.clj -r
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

2. 在应用程序中嵌入 REPL 服务器以从另一个客户端连接

您可以在应用程序启动时嵌入您自己的 repl(例如,仅启动 repl 实例的简单 main),然后您的用户可以运行您的 jar 文件,并使用他们选择的工具(cider-jack-in)单独连接到它,'lein repl 连接...')

其简单版本是:

(start-server :port 7890 :handler cider-nrepl-handler)
Run Code Online (Sandbox Code Playgroud)

替换您想要的端口,请参阅下文以了解要导入的适当命名空间。

这是一个更完整的示例:

(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)))
Run Code Online (Sandbox Code Playgroud)

您的project.clj 文件中需要以下内容

:plugins        [[cider/cider-nrepl "0.10.0"]] ;; or whatever version you prefer
:dependencies   [[org.clojure/tools.nrepl "0.2.12"]]
Run Code Online (Sandbox Code Playgroud)

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