clojure - 使用外部依赖项加载 my-project.core 时出现 FileNotFoundException

标签 clojure read-eval-print-loop leiningen

当尝试使用外部库时,我在 Clojure REPL 中收到 FileNotFoundException 。例如,我使用 lein new example-twitter-project 创建一个新项目。然后我编辑文件:

project.clj:

(defproject example-twitter-project "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [clojure-twitter "1.2.6-SNAPSHOT"]])

src/example-twitter-project/core.clj:

(ns example-twitter-project.core
  (:use 'twitter))

然后我运行 lein deps,然后运行 ​​lein repl

example-twitter-project$ lein repl
REPL started; server listening on localhost port 23833
user=> (use :reload-all 'example-twitter-project.core)
FileNotFoundException Could not locate quote/twitter__init.class or quote/twitter.clj on classpath:   clojure.lang.RT.load (RT.java:430)

同时,我可以直接使用 REPL 中的外部库:

user=> (use 'twitter)
nil
user=> (doc twitter/with-oauth)
-------------------------
twitter/with-oauth
([consumer access-token access-token-secret & body])
Macro
  Set the OAuth access token to be used for all contained Twitter requests.
nil

我应该怎么做才能在项目中使用这个外部库?

如果我添加 -main 函数并尝试运行脚本,我会得到类似的 FileNotFoundException,所以这不仅仅是 REPL 问题。

Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate quote/twitter__init.class or quote/twitter.clj on classpath: 
    at clojure.lang.Util.runtimeException(Util.java:165)
...
Caused by: java.io.FileNotFoundException: Could not locate quote/twitter__init.class or quote/twitter.clj on classpath: 
    at clojure.lang.RT.load(RT.java:430)
...

请注意,库的名称及其命名空间是不同的。难道是这个原因?

附注lein 版本:Java 1.6.0_24 OpenJDK 64 位服务器 VM 上的 Leiningen 1.7.1

最佳答案

ns 声明中,您不需要引用 ns 名称,而在 use 表达式中,您必须引用它们

(ns example-twitter-project.core
  (:use twitter))

这是因为 ns 宏在计算参数之前先看到它的参数,它看到符号 twitter 而不是查找 twitter 的值。当从 REPL 调用 use 时,符号 twitter 将在 use 看到它之前被评估,除非您使用 quote 来防止这种情况。

关于clojure - 使用外部依赖项加载 my-project.core 时出现 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9912511/

相关文章:

clojure - leiningen new 抛出异常

vector - 转换嵌套的 clojure 映射

clojure - 如何获取 Java 静态方法的 clojure 句柄,类似于 Java 实例方法的 _memfn_ ?

typescript - 是否可以将 Typescript 导入到 ts-node REPL 的运行实例中?

reflection - 在 Common Lisp 中拦截和修改用户输入

scala - 访问由 Scala REPL 创建的字节码

clojure - "almost a curry"书中的 "Programming Clojure"实现示例

Clojure - 宏扩展如何在 "some"函数内部工作

clojure - lein ring uberjar -- java.lang.NoClassDefFoundError : clojure/lang/Var

clojurescript - 使用 lein figwheel 使所有缓存无效