Clojure не может найти .clj в локальном каталоге. и ./classes на CLASSPATH - PullRequest
14 голосов
/ 26 ноября 2009

Когда я оцениваю (использую 'hello) для загрузки hello.clj, REPL выдает следующую ошибку:

java.io.FileNotFoundException: Could not locate hello__init.class or hello.clj on classpath:  (NO_SOURCE_FILE:0)

Я вызываю REPL так:

java -cp "/Library/Java/Extensions/servlet-api-2.5-20081211.jar:... lots of jarfiles ...:/Library/Java/Extensions/clojure-contrib.jar:/Library/Java/Extensions/clojure-1.0.0.jar:./classes/:." jline.ConsoleRunner clojure.lang.Repl

Читая, похоже, что файл не найден в PWD, но я добавил. на путь безуспешно: - (.

Запуск с Java 1.6 на OS X 10.6.

Я уверен, что я идиот, кто-нибудь может ударить меня ЛАРТ?

EDIT: я также пробовал дистрибутив ClojureX и получил те же результаты.

Ответы [ 5 ]

15 голосов
/ 20 декабря 2009

Если hello.clj находится в $DIR и $DIR находится на вашем пути к классам, тогда hello.clj должен начинаться с (ns hello). Если он находится в $DIR/$SUBDIR и $DIR находится на вашем пути к классам, то hello.clj должен начинаться с (ns $SUBDIR.hello). Как правило, структура вашего имени файла и структура имени ns должны совпадать, с разделителем имени файла, замененным на . в имени ns, и любыми _ s в имени файла, соответствующими - s в имени ns. Имя фактического файла должно быть последним компонентом (возможно, единственным компонентом, если файл, содержащий dir, находится в пути к классам) имени пространства имен.

EDIT:

Расширенный пример. Никакой информации помимо того, что я написал выше, поэтому, пожалуйста, пропустите ее, если вам этого достаточно; однако я знаю, что вначале получить СР было довольно больно, поэтому я решил написать это поэтапно, чтобы кто-нибудь где-нибудь мог избежать этого "опыта обучения" ;-).

Скажите, что это ваше определение пространства имен:

;;; in file "hello.clj"
(ns hello)

(defn hello []
  (println "Hello!"))

Тогда, если вы поместите каталог, содержащий hello.clj, в ваш путь к классам, вы можете пойти, и (use 'hello) в REPL должен делать то, что вы хотите.

Если, с другой стороны, вы делаете это:

;;; in file "hello.clj"
(ns my-namespace)
;;; ...

или это:

;;; in file "my-filename.clj"
(ns hello)
;;; ...

- то есть, если вы введете несоответствие между именем файла и именем пространства имен, Clojure не сможет найти ваше пространство имен.

Кроме того, если вы положили hello.clj в /path/to/code, но на вашем пути к классам на самом деле /path/to, то есть родительский каталог /path/to/code, вам нужно сделать это:

;;; in file "/path/to/code/hello.clj"
(ns code.hello)
;;; ...

Тогда вы сможете (use 'code.hello).

Наконец, если вы называете свой файл my_namespace.clj, вам нужно позвонить своему нс my-namespace (и наоборот). _ s в именах пространства имен и - s в именах файлов не должны использоваться.

3 голосов
/ 28 ноября 2009

Содержит ли hello.clj оператор (ns some-namespace)? Если это так, то same_namespace добавляется к каждому элементу CLASSPATH перед поиском hello.clj

2 голосов
/ 26 ноября 2009

, когда я работаю из repl и хочу загрузить файлы, я обнаружил, что сначала мне нужно вызвать что-то вроде этого:

(add-classpath "file:///home/arthur/.../src/")
(add-classpath "file:///home/arthur/.../build/")

до того, как репл сможет найти их на пути к классам. Я поместил их в файл, который не включен в файл jar вместе с оператором, который перезагружает все из других файлов. Когда я создаю файл jar, я нахожу, что мне не нужно это делать.

1 голос
/ 06 января 2010

На моем .emacs есть следующие строки:

(setq swank-clojure-jar-path "~/src/clojure/clojure.jar"
      swank-clojure-extra-classpaths (append 
                      (directory-files "~/src/compojure/deps" t ".jar$")
                      (list
                       "~/src/swank-clojure/src/main/clojure"
                       "~/src/clojure-contrib/clojure-contrib.jar"
                       "~/src/clj/.")))

Я загружаю программу snake.clj, которая находится в ~ / src / clj, и проверяю ее (C-x h, который выбирает весь буфер, а затем C-c C-c для компиляции) Программа создает пространство имен по имени змея. Теперь из emacs / slime я делаю

(use 'snake)

Вот и все. Теперь вызовите любую функцию, определенную в пространстве имен.

Ваша проблема может заключаться в том, что каталог, в котором у вас есть hello.clj, может отсутствовать в вашем пути к классам. Также убедитесь, что вы правильно назвали пространство имен. Если внутри hello.clj вы назвали свое пространство имен как hello, тогда вы делаете (используйте 'hello).

1 голос
/ 03 декабря 2009

Я определил псевдоним (в .bash_profile) для загрузки REPL:

alias clojure='CLASSPATH=$HOME/git/clojure/clojure.jar:$HOME/git/clojure-contrib/clojure-contrib.jar:.:classes rlwrap java clojure.lang.Repl'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...