NoClassDefFoundError в протоколе, когда требуется его пространство имен - PullRequest
2 голосов
/ 14 мая 2011

Это рецепт исключения, которое я получаю (РЕДАКТИРОВАТЬ: ProtoImpl определено в других нс, я опущу его для упрощения описания):

myns.clj

(ns myns)

(defprotocol Proto
  (func [this]))

(extend-protocol Proto
  ProtoImpl
  (func [this] (do-something ...)))

interop.clj

(ns interop
  (:require [myns :as m]))

(defn startup
  []
  (m/func (ProtoImpl.)))

(gen-class :name interop.Interop
           :prefix "interop-"
           :methods [[boot [] void]])

(defn interop-boot
  [this]
  (startup)))

И myns.clj, и interop.clj поставляются в веб-приложении, причем последнее также компилируется AOTтаким образом, создание Interop.class доступно в classpath сразу.Это создается как Spring bean-компонент.

При запуске веб-приложения он не запускается со следующим исключением:

[...]
    at myns__init.load(Unknown Source)
    at myns__init.<clinit>(Unknown Source)
[...]
    at interop.Interop.<clinit>(Unknown Source)
[...]
Caused by: NoClassDefFoundError: myns.Proto

Что может вызвать эту проблему?


РЕДАКТИРОВАТЬ: Я больше не могу воспроизвести ошибку, я перекомпилировал и перезапустил приложение, которое безупречно запустилось ... Тем не менее, мне бы очень хотелось понять, в каких ситуациях может возникнуть такая проблема.

Мне кажется, что загрузчик классов не смог найти определение класса для Proto, что, как я полагаю, является ролью clojure RT для загрузки, как только будет проанализирован соответствующий исходный файл .clj.Как вы можете видеть в извлечении трассировки стека, которую я получаю, myns загружается, и именно там определено Proto.Почему я получил NoClassDefFoundError?

Ответы [ 2 ]

1 голос
/ 14 мая 2011

Записи Clojure предполагается импортировать.Должно работать следующее:

(ns interop
  (:require [myns :as m])
  (:import  myns.Proto))
0 голосов
/ 13 августа 2014

У меня была такая же проблема. Добавление обоих классов в :aot в моем project.clj решило проблему. Ваш project.clj будет выглядеть примерно так: :aot [myns interop].

...