2016-06-24 2 views
1

Попытка сделать простую программу clojure без нее включает функцию, определенную в другом файле. Он не может найти файл в том же каталоге.Включая файлы в Clojure без Leiningen: Не удалось найти файл

helloInclude 
    src 
     main.clj 
     importer.clj 

main.clj

(ns main 
    (:gen-class) 
(:require [importer])) 

(defn -main 
    [& args] 
    (println "Hello, World!")) 

(-main) 
(println (func 5 6)) 

importer.clj

(ns importer 
    (:gen-class)) 

(defn func 
    [a b] 
    (+ a b 1)) 

Выполненная из каталога src с:

java -jar "Path\To\Clojure\clojure-1.8.0\clojure-1.8.0.jar" -i main.clj 

Возвращает сообщение об ошибке:

Exception in thread "main" java.io.FileNotFoundException: Could not locate importer__init.class or importer.clj on classpath., compiling:(C:\Users\jamesjenkinson\Clojure\helloInclude\src\main.clj:1:1) 
     at clojure.lang.Compiler.load(Compiler.java:7391) 
     at clojure.lang.Compiler.loadFile(Compiler.java:7317) 
     at clojure.main$load_script.invokeStatic(main.clj:275) 
     at clojure.main$init_opt.invokeStatic(main.clj:277) 
     at clojure.main$init_opt.invoke(main.clj:277) 
     at clojure.main$initialize.invokeStatic(main.clj:308) 
     at clojure.main$null_opt.invokeStatic(main.clj:342) 
     at clojure.main$null_opt.invoke(main.clj:339) 
     at clojure.main$main.invokeStatic(main.clj:421) 
     at clojure.main$main.doInvoke(main.clj:384) 
     at clojure.lang.RestFn.invoke(RestFn.java:421) 
     at clojure.lang.Var.invoke(Var.java:383) 
     at clojure.lang.AFn.applyToHelper(AFn.java:156) 
     at clojure.lang.Var.applyTo(Var.java:700) 
     at clojure.main.main(main.java:37) 
Caused by: java.io.FileNotFoundException: Could not locate import__init.class or import.clj on classpath. 
     at clojure.lang.RT.load(RT.java:456) 
     at clojure.lang.RT.load(RT.java:419) 
     at clojure.core$load$fn__5677.invoke(core.clj:5893) 
     at clojure.core$load.invokeStatic(core.clj:5892) 
     at clojure.core$load.doInvoke(core.clj:5876) 
     at clojure.lang.RestFn.invoke(RestFn.java:408) 
     at clojure.core$load_one.invokeStatic(core.clj:5697) 
     at clojure.core$load_one.invoke(core.clj:5692) 
     at clojure.core$load_lib$fn__5626.invoke(core.clj:5737) 
     at clojure.core$load_lib.invokeStatic(core.clj:5736) 
     at clojure.core$load_lib.doInvoke(core.clj:5717) 
     at clojure.lang.RestFn.applyTo(RestFn.java:142) 
     at clojure.core$apply.invokeStatic(core.clj:648) 
     at clojure.core$load_libs.invokeStatic(core.clj:5774) 
     at clojure.core$load_libs.doInvoke(core.clj:5758) 
     at clojure.lang.RestFn.applyTo(RestFn.java:137) 
     at clojure.core$apply.invokeStatic(core.clj:648) 
     at clojure.core$require.invokeStatic(core.clj:5796) 
     at clojure.core$require.doInvoke(core.clj:5796) 
     at clojure.lang.RestFn.invoke(RestFn.java:408) 
     at src.main$eval3$loading__5569__auto____4.invoke(main.clj:1) 
     at src.main$eval3.invokeStatic(main.clj:1) 
     at src.main$eval3.invoke(main.clj:1) 
     at clojure.lang.Compiler.eval(Compiler.java:6927) 
     at clojure.lang.Compiler.eval(Compiler.java:6916) 
     at clojure.lang.Compiler.load(Compiler.java:7379) 
     ... 14 more 

Также пытались явно призывающие классы быть текущий каталог:

java -classpath . -jar "Path\To\Clojure\clojure-1.8.0\clojure-1.8.0.jar" -i main.clj 

Я не может использовать Leiningen для этого. Как правильно ссылаться на файл?

Редактировать: Изменено пространство имен на верхнем уровне.

+1

попробуйте удалить "src." из обеих деклараций пространств имен. (если src является вашей корневой папкой) else, если «helloInclude» является root, перепишите '(require [import])' to '(require [src.import])' – leetwinski

+0

src - это корневая папка. Удалено 'src' из обоих объявлений, все равно не работает. –

+0

У вас неправильный синтаксис пространства имен. попробуйте переписать его следующим образом: main: '(ns main (: gen-class) (: require [import]))', import: '(ns import (: gen-class))'. Кроме того, я бы переименовал 'import' в нечто другое, так как уже есть' import' в clojure – leetwinski

ответ

0

require только находит файлы, находящиеся под вашим пути к классу. Если вы хотите использовать require, путь к вашему коду относительно пути к классам должен соответствовать пакету и имени пространства имен. -cp arg для java может добавлять каталоги в путь к классам, а текущий каталог - , а не неявно в пути к классам.

Если файл равен import, он должен быть непосредственно в верхнем каталоге, а его пакет должен быть изменен, так что это пространство имен верхнего уровня. Чтобы потребовать его с его текущим местоположением и пакетом, вы должны использовать src.import вместо import.

Также не рекомендуется использовать пространства имен верхнего уровня.

Наконец, надлежащим вариантом для запуска -main является -m.

+$ ls 
import.clj main.clj 
+$ cat import.clj 
(ns import) 

(defn foo 
    [] 
    (println "hello")) 
+$ cat main.clj 
(ns main 
    (:require [import]) 
    (:gen-class)) 

(defn -main 
    [& args] 
    (import/foo)) 
:$ java -cp ~/bin/clojure.jar:. clojure.main -m main 
hello 
+0

Это выполняется из папки 'src'. Я изменил пространства имен, чтобы удалить '.src', но все же не повезло. –

+0

Также попытался выполнить из родительской папки, как с основным в 'src', так и с основным в родительском, с соответствующими пространствами имен. Также не удается найти файл. –

+0

также, имя файла должно соответствовать пространству имен - если ns является 'import', файл должен быть' import.clj' не 'импортером.clj' – noisesmith

Смежные вопросы