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, поэтому вам или кому-то другому не нужно будет искать его.

Другие вопросы по тегам