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)).

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