Это рецепт исключения, которое я получаю (РЕДАКТИРОВАТЬ: 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
?