如何使用Clojure REPL(La Clojure)加载具有依赖项的单个clojure文件?

时间:2015-10-15 09:07:50

标签: intellij-idea clojure la-clojure

我正在使用Intelli C ID的La Clojure插件来加载我的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 个答案:

答案 0 :(得分:2)

导致错误的是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 no Leiningen”,你应该在本地拥有依赖jar文件(例如,从Maven Central下载),然后你可以在启动时添加类路径REPL:

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

它通常应该给出相同的结果。