这是我得到的异常的配方(编辑:ProtoImpl
在另一个ns中定义,我将其留下以简化描述):
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都是在webapp中发布的,后者也是AOT编译的,因此可以立即在类路径中生成Interop.class。这被实例化为Spring bean。
当webapp启动时,它无法引导,但出现以下异常:
[...]
at myns__init.load(Unknown Source)
at myns__init.<clinit>(Unknown Source)
[...]
at interop.Interop.<clinit>(Unknown Source)
[...]
Caused by: NoClassDefFoundError: myns.Proto
可能导致此问题的原因是什么?
编辑:我再也无法重现错误了,我重新编译并重新运行应用程序,它完美启动......但我真的很想了解这样的问题可以在哪些情况下显示起来。
在我看来,类加载器找不到Proto
的类定义,我假设一旦解析了相关的.clj源文件,就会加载clojure RT的角色。正如您在我收到的堆栈跟踪的摘录中看到的那样,正在加载myns,并且正好在那里定义了Proto
。我怎么得到NoClassDefFoundError
?
答案 0 :(得分:1)
Clojure Records应该是导入的。以下应该有效:
(ns interop
(:require [myns :as m])
(:import myns.Proto))
答案 1 :(得分:0)
我遇到了同样的问题。在我的:aot
中将这两个类添加到project.clj
解决了这个问题。您的project.clj
会有类似这样的内容::aot [myns interop]
。