2016-01-03 2 views
3

Предположим, что я выполнил несколько функций для некоторых личных расчетов на работе. Я хотел бы построить .jar (uberjar), что мои коллеги использовали бы тоже в REPL, как:Запустите REPL из моего приложения

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

Какой код следует ввести для РЕПЛ, чтобы начать, когда .jar запусков?

ответ

4

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"]] 

После подключения к пользовательскому РЕПЛ, стандартные правила применяются, только изменения пространство имен и вызовите свои функции.

+0

Ой, я думал, что будет что-то более простое ... – Gra

+0

ну, вам нужно всего лишь запустить '(start-server: port 7888: handler cider-nrepl-handler)' как абсолютный минимум в вашем основном методе. Остальное я взял из своего собственного кода для получения значений среды из файлов конфигурации. –

+0

ОК. Теперь я понимаю ваш ответ. Я не хочу, чтобы пользователи подключались из другого приложения. Я хочу, чтобы они просто приветствовали .jar (двойной клик или CLI) и запускает REPL. – Gra