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

3
我将使用IntelliJ IDEA的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
"la clojure" 不再受支持。它已被 "cursive" 取代。 - leeor
你是否已经使用leinngen设置了项目? - leeor
谢谢,伙计。我通过在终端上运行'repl'命令来解决了这个问题。 - zhanbo_kz
1个回答

2
导致错误的原因是 classpath(用于启动Clojure REPL的)没有包含 clojure.tools.logging 库。Test.clj 需要引用它,所以当REPL加载它时,无法找到所需的包,从而导致错误。
我不确定您如何启动REPL,但答案的其余部分假定这是终端上的常规REPL(而不是来自IntelliJ IDEA本身;如果REPL是从IntelliJ IDEA启动的 - 我会说这是最后一个配置失误,因为它应该使用正确的项目classpath启动REPL - 要检查的第一件事将是项目配置)。
因此,要修复它,请确保REPL拥有所有依赖项(在此情况下为clojure.tools.logging)在classpath中。例如,可能最简单的事情就是添加一个 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中央仓库下载),然后在启动REPL时将它们添加到类路径中:

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

通常情况下,它应该会给出相同的结果。


谢谢,Timur。这非常有帮助。 - zhanbo_kz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接