当尝试使用外部库时,我在 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/