假设我已经为工作中的某些个人计算实现了一些功能。我想建立一个.jar
(uberjar),我的同事也会在REPL中使用它,例如:
megacorpcalcs.core=> (+ 2 2)
4
megacorpcalcs.core=> (salary 8 0.4)
666$
我应该输入什么代码才能在.jar
启动时启动REPL?
答案 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后,将应用标准规则,只需更改命名空间并调用您的函数。