ClassNotFoundException при использовании другого ns
Как бы ни был прост этот вопрос, я не могу найти правильный путь для разных пространств имен в одном и том же каталоге, чтобы правильно ссылаться друг на друга. У меня есть два файла:
project_root/src/babbler/core.clj
:
(ns babbler.core
(:gen-class)
(use '[clojure.string :only (join split)]))
(defn foo [] "Foo")
а потом project_root/src/babbler/bar.clj
:
(ns babbler.bar)
(use [babbler.core :as babble])
Этот файл также содержит основной метод, который указан в моем project.clj
с помощью :main babbler.bar
Вся моя структура построена против часовой стрелки, с шаблоном leiningen по умолчанию.
Результат бега lein repl
это:
Exception in thread "main" java.lang.ClassNotFoundException: babbler.core, compiling:(babbler/bar.clj:3:1)
at clojure.lang.Compiler.analyze(Compiler.java:6380)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$VectorExpr.parse(Compiler.java:3024)
at clojure.lang.Compiler.analyze(Compiler.java:6363)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
(...)
1 ответ
Ваш use
должно быть внутри определения пространства имен:
(ns babbler.bar
(use [babbler.core :as babble]))
по факту use
не рекомендуется, вы можете написать это как:
(ns babbler.bar
(:require [babbler.core :as babble :refer [foo]]))
Таким образом, вы можете вызвать любую функцию f из пространства имен babbler.core как babble / f, и вы можете вызвать foo напрямую. Кроме того, в вашем файле есть информация о том, откуда поступил foo, поэтому вам или кому-то другому не нужно будет искать его.