FileNotFoundException при загрузке my-project.core с внешней зависимостью - PullRequest
2 голосов
/ 28 марта 2012

Я получаю 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)
...

Обратите внимание, что имя библиотеки и ее пространство имен разные. Может ли это быть причиной?

P.S. lein version: Leiningen 1.7.1 на Java 1.6.0_24 64-разрядная серверная виртуальная машина OpenJDK

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

в ns объявлениях вам не нужно заключать в кавычки имена ns, а в use выражениях вы должны заключать их в кавычки

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

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

3 голосов
/ 28 марта 2012

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

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