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?
编辑:在你发表评论后,我把这个答案分成了 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 后,将应用标准规则,只需更改命名空间并调用您的函数。