ClassNotFoundException, когда класс создается макросом gen-class в Clojure
У меня есть пространство именmyorg.helpers.fs-input-stream
- Его определение
(ns myorg.helpers.fs-input-stream)
(gen-class
:name "myorg.helpers.FsInputStream"
:extends java.io.ByteArrayInputStream
:implements [org.apache.hadoop.fs.Seekable org.apache.hadoop.fs.PositionedReadable]
:main false
:exposes {buf {:get getBuf}
pos {:get getPos}
mark {:get getMark}}
:init-impl-ns false)
У меня есть другое пространство имен, которое использует класс, созданный указанным выше пространством имен. Его определение -
(ns myorg.plugin.orc-output
(:import
(myorg.helpers FsInputStream)
(org.apache.hadoop.fs FileSystem FSDataInputStream)))
(set! *warn-on-reflection* true)
(defn input-stream-filesystem [buffered-bytes]
(proxy [FileSystem] []
(open [_]
(FSDataInputStream. (FsInputStream. buffered-bytes)))))
Затем я проверяю пространство именmyorg.plugin.orc-output
называетсяmyorg.plugin.orc-output-test
. Там очень простой тест
(ns myorg.plugin.orc-output-test
(:require [clojure.test :refer :all])
(:require [myorg.plugin.orc-output :refer :all]))
(deftest orc-create
(is (= 1 1)))
Когда я запускаю тест в Intellij Idea, я получаю сообщение об ошибке:
Синтаксическая ошибка (ClassNotFoundException) при компиляции (myorg/plugin/orc_output.clj:1:1).myorg.helpers.fs-input-stream.FsInputStream
Полный отчет по адресу: /var/folders/b_/_t677thx43n6pd8l8x0c1qjr0000gp/T/clojure-13616919898936783952.edn.
Как я могу это исправить?
Примечание. Проект также находится на github.
1 ответ
Когда используешьgen-class
как макрос, а не использовать его как частьns
форму, вам необходимо предоставить:name
это полное имя создаваемого класса. Пока все хорошо, за исключением того, что вам не обязательно использовать здесь строку — это может быть и символ::name myorg.helpers.FsInputStream
.
Класс с указанным именем будет сгенерирован в указанном пакете, поэтому вам придется импортировать его как таковой. И вот здесь вы допустили ошибку:[myorg.helpers.fs-input-stream FsInputStream]
на самом деле должно быть[myorg.helpers FsInputStream]
(я бы написал так(myorg.helpers FsInputStream)
).