Исключение FileNotFoundException при загрузке my-project.ядро с внешней зависимостью


Я получаю FileNotFoundException в Clojure REPL, когда пытаюсь использовать внешнюю библиотеку. Например, я создаю новый проект с помощью 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)

В то же время, я могу use внешняя библиотека из 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 version: Leiningen 1.7.1 на Java 1.6.0_24 использовать OpenJDK 64-разрядный сервер VM

2 2

2 ответа:

Вам не нужно использовать quote в (ns (:use ...)), поэтому ваш код будет выглядеть следующим образом:

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

В объявлениях ns Вы не должны цитировать имена ns, а в выражениях use вы должны цитировать их

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

Это происходит потому, что макрос ns видит свои аргументы до того, как они будут оценены, он видит символ twitter вместо того, чтобы искать значение twitter. при вызове use из REPL символ twitter будет вычислен до того, как use увидит его, если только вы не используете quote, чтобы предотвратить это.