Как загрузить один файл clojure с зависимостями, используя Clojure REPL (La Clojure)?

Я использую плагин La Clojure для IntelliJ IDEA, чтобы загрузить мой файл clj, а затем получить функцию внутри этого файла. Мой файл Test.clj имеет следующее содержимое:

(ns test.Test
  (:require [clojure.tools.logging :as logger])
 )

 (defn addx [a b c]
   (logger/debug "adding...")
   (+ a b c))

На консоли Clojure REPL я пытаюсь загрузить файл:

(load-file "/home/.../test/Test.clj")

Это дает мне следующую ошибку:

FileNotFoundException Не удалось найти clojure/tools/logging__init.class или clojure/tools/logging.clj по пути к классам: clojure.lang.RT.load (RT.java:443)

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо.

1 ответ

Решение

Что приводит к ошибке, так это то, что classpath (тот, который использовался для запуска Clojure REPL) не включает clojure.tools.logging библиотека. Test.clj требует, поэтому REPL при загрузке не может найти требуемый пакет, следовательно, ошибка.

Я не уверен, как вы запускаете REPL, но остальная часть ответа предполагает, что это обычный REPL в терминале (не из самой IntelliJ IDEA; если REPL запускается из IntelliJ IDEA - я бы сказал, что это неверная конфигурация последней, поскольку предполагается, что REPL запускается с правильным путем к классу проекта - первым делом нужно проверить конфигурацию проекта).

Чтобы это исправить, убедитесь, что у REPL есть все зависимости (в данном случае - clojure.tools.logging) в классе. Например, возможно, самое простое, что можно сделать, это добавить project.clj с объявленными в нем зависимостями и используйте Lieningen для запуска REPL. Голые кости project.clj что бы сделать трюк это:

(defproject my-project "0.0.1-SNAPSHOT"
  :dependencies [[org.clojure/tools.logging "0.3.1"]])

Теперь из того же каталога, где project.clj в:

$ lein repl 
...
user=> (load-file "Test.clj")
#'test.Test/addx
user=> (test.Test/addx 13 9 20)
42

Или, если вы хотите использовать "чистый Clojure REPL без Leiningen", у вас должны быть локальные файлы зависимостей jar (например, загрузка из Maven Central), а затем вы можете добавить их classpath при запуске REPL:

$ java -cp /path/to/clojure.jar:/path/to/tools.logging-0.3.1.jar clojure.main

и это должно обычно давать тот же результат.

Другие вопросы по тегам