EDIT: после того, как ваши комментарии я разделить этот ответ на 2
1. Запуск 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, но ваше приложение не загружается.
Обратите внимание, что вам нужен символ @, чтобы он загружался из файла jar относительно пути к классам (например, из корня jar).
Это должно начать Repl, которые вы можете изменить пространство имен и запускать свои прикладные функции в.
Кроме того, вы можете установить rlwrap
и предварять команду Java с ним, так что вы можете использовать историю и клавиши со стрелками здраво.
2. Встраивание сервера REPL в приложении для подключения к от другого клиента
Вы можете вставлять свою собственную Repl при запуске приложения (например, простые основной, который только начинает экземпляр Repl), и затем пользователи могут запустить файл банку, так и отдельно подключаться к нему с их выбором инструмента (сидр самоподъемной в «Lein РЕПЛ подключения ...»)
простая версия этого:
(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"]]
После подключения к пользовательскому РЕПЛ, стандартные правила применяются, только изменения пространство имен и вызовите свои функции.
Ой, я думал, что будет что-то более простое ... – Gra
ну, вам нужно всего лишь запустить '(start-server: port 7888: handler cider-nrepl-handler)' как абсолютный минимум в вашем основном методе. Остальное я взял из своего собственного кода для получения значений среды из файлов конфигурации. –
ОК. Теперь я понимаю ваш ответ. Я не хочу, чтобы пользователи подключались из другого приложения. Я хочу, чтобы они просто приветствовали .jar (двойной клик или CLI) и запускает REPL. – Gra